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

本文关键字:字符串 查询 包含 密码 何安全 安全 | 更新日期: 2023-09-27 17:54:34

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

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

  1. 该网站没有,也不会有链接/图像/javascript/分析到/从其他网站。所以没有推荐链接担心。
  2. 与web浏览器的所有通信将通过https。
  3. 我知道查询字符串将保留在历史记录中电脑。
  4. 登录需要的不仅仅是密码/用户名。所以简单将url粘贴回浏览器将不会导致登录。

我知道该站点可能容易受到跨站点脚本和重放攻击。我如何减轻这些?

给定上述场景,我应该如何在查询字符串中包含密码?

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

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

SSL

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

隐藏在标题

基本认证协议将用户/密码信息放在HTTP请求头中。c#和许多其他web服务器语言可以访问这些信息,并使用它来验证请求。当使用SSL时,这是非常安全的。

注册应用键

如果以上都不可能,那么建议您为每个用户创建一个唯一的密钥。而不是发送他们的密码,这个密钥被使用。优点是键存储在数据库中,可以删除。用户的密码保持不变,但他们必须再次注册以获得新密钥。如果有人有可能滥用他们的密钥,这是很好的。

握手

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

<标题> 加密密码

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

通常不建议将秘密放在查询字符串中,然后可以将其标记和复制,从而暴露历史文件,cookie等中的静态密码。

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

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

在过去的日子里,童车是一种东西(好吧-它们仍然是一些边缘群体的东西,但是)-我们使用"会议"。一个"session-ID"(参见JSESSION_ID),例如在基于Java/J2EE/Servlet的系统中被存储为cookie。该值是一个随机数,很难猜测,但它存在从劫持到内存和服务器查找开销等问题。

在2020年(截至撰写本文时)…JSON Web令牌(JWT)可用于安全封装用户会话信息,并将其推入不可变的cookie中,而无需暴露密码,并且服务器开销很小。

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

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

裁判:https://oauth.net/2/jwt/

在这一点上,客户端不能做任何事情来破坏(甚至查看)cookie,因为任何敏感数据都应该被加密(使用AES256等或更好的),内容散列和散列签名。这意味着当服务器获得令牌返回时,它会查看时间戳并可能将其丢弃-强制重新身份验证,然后…

可以验证它对内容进行签名,对内容进行散列,并在需要时验证散列和解密数据(不包括密码,而只是用户ID -这是经过验证的,但不一定是秘密)。

这可以包括用户可以做什么的已经查找的范围(授权)等-避免到身份验证服务器的往返,直到令牌超时。

因此,上面的方法(使用jwt、散列、签名、加密到cookie中)是推荐的无状态方式,同时避免在客户端和服务器之间传递秘密。

裁判:https://auth0.com/blog/stateless-auth-for-stateful-minds/

此外,考虑到多因素身份验证方案(参见Google authenticator)和相关系统是一种更强的安全姿态(窃取密码是不够的,密钥在外部系统上自动旋转),但确实需要半频繁地访问旋转密钥系统,这在一定程度上抑制了顺畅的用户体验。

更新:谷歌和其他公司的多因素认证已经变得更好了。

老公司仍然使用短信一次性密码(OTP)…这可以通过去无线公司商店声称SIM卡丢失(给定一个已知的电话号码)来破解。相比之下,谷歌和其他更先进的公司使用的是可旋转的代币,这些代币可以嵌入智能手机应用程序中,然后用于许多服务。谷歌甚至有推送通知,用户只需按下按钮确认:"是-它是我"。