Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在查询字符串中安全地包含密码_C#_Asp.net_Encryption_Passwords_Query String - Fatal编程技术网

C# 如何在查询字符串中安全地包含密码

C# 如何在查询字符串中安全地包含密码,c#,asp.net,encryption,passwords,query-string,C#,Asp.net,Encryption,Passwords,Query String,是否可以在c#asp.net站点的查询字符串中安全地包含密码 我知道的一些假设和事情- 该网站没有也不会有与其他网站的链接/图片/javascript/分析。所以没有推荐链接可担心 与web浏览器的所有通信都将通过https进行 我知道查询字符串将保留在 电脑 登录时需要的不仅仅是密码/用户名。这么简单 将url粘贴回浏览器不会导致登录 我知道该站点可能容易受到跨站点脚本和重播攻击。如何缓解这些问题 鉴于上述情况,我应该如何在查询字符串中包含密码 请不要问我“为什么”,我知道这不是一个好主意,但

是否可以在c#asp.net站点的查询字符串中安全地包含密码

我知道的一些假设和事情-

  • 该网站没有也不会有与其他网站的链接/图片/javascript/分析。所以没有推荐链接可担心
  • 与web浏览器的所有通信都将通过https进行
  • 我知道查询字符串将保留在 电脑
  • 登录时需要的不仅仅是密码/用户名。这么简单 将url粘贴回浏览器不会导致登录
  • 我知道该站点可能容易受到跨站点脚本和重播攻击。如何缓解这些问题

    鉴于上述情况,我应该如何在查询字符串中包含密码

    请不要问我“为什么”,我知道这不是一个好主意,但这是客户想要的。

    SSL 您可以使用SSL连接将密码安全地发送到web服务器。这将加密客户端/服务器之间的所有通信

    隐藏在标题中 基本身份验证协议将用户/密码信息放在HTTP请求头中。C#和许多其他web服务器语言可以访问此信息,并使用它对请求进行身份验证。当与SSL混合使用时,这是非常安全的

    注册应用程序密钥 如果上述任何一项都不可行,建议为每个用户创建一个唯一的密钥。而不是发送他们的密码,使用此密钥。其优点是密钥存储在数据库中,可以删除。用户的密码保持不变,但他们必须再次注册才能获得新密钥。如果有人可能滥用钥匙,这是很好的

    握手 握手是客户端向服务器发出请求,服务器发回随机生成的密钥。然后,客户端使用一个秘密从该密钥生成一个散列,并将其发送回服务器。然后,服务器可以检查客户机是否知道正确的秘密。如果密码是秘密,客户端在请求中包含用户名详细信息,也可以执行同样的操作。这可以在不发送密码的情况下进行身份验证

    加密密码 如果上述选项都不可行,那么您可以尝试在通过开放URL发送密码之前使用JavaScript对密码进行加密。我找到了一个开源版本。该项目被调用并支持128到256位加密。可能还有其他JS库做同样的事情。

    SSL 您可以使用SSL连接将密码安全地发送到web服务器。这将加密客户端/服务器之间的所有通信

    隐藏在标题中 基本身份验证协议将用户/密码信息放在HTTP请求头中。C#和许多其他web服务器语言可以访问此信息,并使用它对请求进行身份验证。当与SSL混合使用时,这是非常安全的

    注册应用程序密钥 如果上述任何一项都不可行,建议为每个用户创建一个唯一的密钥。而不是发送他们的密码,使用此密钥。其优点是密钥存储在数据库中,可以删除。用户的密码保持不变,但他们必须再次注册才能获得新密钥。如果有人可能滥用钥匙,这是很好的

    握手 握手是客户端向服务器发出请求,服务器发回随机生成的密钥。然后,客户端使用一个秘密从该密钥生成一个散列,并将其发送回服务器。然后,服务器可以检查客户机是否知道正确的秘密。如果密码是秘密,客户端在请求中包含用户名详细信息,也可以执行同样的操作。这可以在不发送密码的情况下进行身份验证

    加密密码
    如果上述选项都不可行,那么您可以尝试在通过开放URL发送密码之前使用JavaScript对密码进行加密。我找到了一个开源版本。该项目被调用并支持128到256位加密。可能还有其他JS库也做同样的事情。

    通常不建议将机密放入查询字符串中,然后可以对其进行图书标记和复制,从而在历史文件、cookie等中公开静态密码

    为了在这个用例中保护密码,可以选择散列密码(单向,不可逆)。这样,在传输过程中或静止时都不知道实际密码,但。。。这意味着攻击者仍然可以使用哈希值登录到服务器,该服务器可能会将哈希值与其存储区进行比较以进行身份验证

    更新:切换到无状态(JWT)会话

    在过去,四轮马车是一种东西(好吧,它们仍然是一些边缘团体的东西,但是),我们使用“会话”。 例如,在基于Java/J2EE/Servlet的系统中,“会话ID”(参见JSESSION_ID)被存储为cookie。该值是一个随机数,很难猜测,但它存在着从劫持到内存以及服务器上的查找开销等问题

    2020年(截至本文撰写之时)。。。JSON Web令牌(JWT)可用于安全地封装用户会话信息,并在不可更改的cookie中向下推送,而无需公开密码,且服务器开销很小

    在这个模型中,在登录之后,服务器发出一个令牌(使用OAUTH2或相关的),该令牌有一个过期时间戳

    然后,这些数据和其他可能的会话信息可以被加密、散列、签名并封装在JWT(令牌)中,作为cookie返回到web浏览器

    参考:

    在这一点上,客户机不能做任何事情来破坏(甚至查看)cookie,因为任何敏感数据都应该被加密(使用AES256等或更好的方法),并且内容被散列,散列被签名。这意味着当服务器取回令牌时,它