【问题标题】:Storing Credentials in Local Storage在本地存储中存储凭证
【发布时间】:2011-12-13 04:24:25
【问题描述】:

我可以安全地使用本地存储而不是 cookie 来存储会话凭据吗?

我需要存储一个加密的哈希吗??

编辑:这是否足够安全?

  • 用户登录。

  • 服务器返回成功消息,包括加盐 bcrypt 哈希混合用户 ID、密码、时间戳和可能的 IP 地址。这保存在本地存储中。

  • 在将来的连接中发送此哈希,只要 IP 地址未更改且时间限制未过期,服务器就会承担责任。

【问题讨论】:

  • 本地存储是永久的,不会过期。我认为将会话凭据永久存储在浏览器中并不是一个好主意。此类信息应在会话结束时过期。
  • @Šime 不,我特别希望它是持久的。它的有效性可以在服务器端过期。

标签: javascript security html encryption local-storage


【解决方案1】:

如果您打算使用 localStorage 而不是 cookie,则可以使事情比 cookie 更安全。那是因为您不需要在每个请求中都向服务器发送会话 ID,使其成为不记名令牌。相反,您可以在客户端将用户密码存储在 localStorage 中,并使用它来签署您的请求,此外还会发送相应的公钥并用作会话 ID。这样,服务器端或代理上的任何人都无法伪造您的请求。

【讨论】:

    【解决方案2】:

    如果您要使用本地存储,为什么要存储用户凭据或从它们派生的任何内容?

    我一直在考虑做的是:

    成功登录后,生成一个与用户凭据无关的完全随机字符串,并将其与到期日期一起存储在数据库中。然后我会将该字符串传递给我的 js 以存储在本地存储中。

    从那时起,只要该本地存储凭据与数据库一匹配并且超时未过期,我就会自动认为他们已登录。

    这样,就不会存在从本地存储中泄露用户凭据的风险。但是,由于这个临时的唯一字符串本质上用作 sessionID,您仍然需要注意并采取预防措施来防范与会话劫持相关的风险。

    无论如何,我的理解是本地存储与您网站背后的服务器一样安全。我的意思是本地存储只能通过通过您自己的域进入的脚本访问,因此只要运行的唯一前端代码是您自己的,您就很安全。

    【讨论】:

    • 那么私人会议呢?当您无权访问本地存储时?
    • @Farsheed 你不应该能够在隐身模式下继续在它之外启动的会话,这就是私人会话的意义,把它想象成你使用的是一个完全不同的浏览器.
    【解决方案3】:

    您的服务器应生成一些令牌 - 无法用于发现用户名/密码的唯一(对于服务器)数据。只有该令牌可以以任何形式存储在用户的机器上。 localStorage 和 cookie 都不安全。因此,在这方面,同样的规则也适用于他们。

    您应该有一些方法使此类令牌过期,否则一旦被盗,此类令牌就可以用来代替真实凭据。

    【讨论】:

      【解决方案4】:

      localstorage 和 cookie 一样容易被 JavaScript 读取。

      localstorage 可以使用 same 域中的 JavaScript 读取,如果您控制域上的所有 JS,那么这应该不是问题。但是如果执行了任何其他代码(例如通过注入,或者如果您与其他人共享域),他们将能够访问存储数据。

      这与 cookie 相同,但通常 cookie 设置为 HTTPOnly,因此 JavaScript 无法读取它。

      在任何一种情况下,纯文本登录信息都不应该存储在 cookie 或本地存储中,就好像有人确实掌握了它们一样,他们可以不断地为自己创建一个新会话。

      您应该加密经过身份验证的标识符(例如他们的用户 ID)以及会话到期的日期时间,然后将此值存储在 cookie 或本地存储中。然后在每次服务器调用时验证此令牌。

      【讨论】:

      • 存储用户 ID、密码和时间戳的加盐 bcrypt 哈希是否足够安全,如果存在,我可以假设用户的身份?然后我可以决定服务器端这个假设应该持续多长时间?
      • 是的,我使用 bcrypt,但我不加密用户 ID/密码。要发出令牌,首先要匹配密码,然后只存储用户 ID 和盐。只要您还包括时间戳,这也很好,必要时过期。在服务器上,我检测到这个令牌的存在,我可以解密它,其中包含的 userId 存在,并且时间戳没有过期,只有在这一切之后,我才假设该用户的身份。
      • 啊,你解密了吗?您不只是将其与参考相匹配吗?你是怎么解密的?
      • 这超出了最初问题的范围,您应该打开一个新问题。已经有很多关于身份验证令牌方法的资源可用,包括 bCrypt 的使用。但本质上,一旦生成令牌,使用 localStorage 或 cookie 存储令牌几乎没有什么区别,这是提出的问题。在您使用用户凭据信息填充 FormsAuthenticationTicket 之后,您存储的内容可以是 FormsAuthentication.Encrypt() 的输出。结果字符串是一个加密令牌,使用您在 web.config 中设置的任何方法
      • (假设您使用 .NET,例如,不确定您使用的是什么后端服务器)。
      猜你喜欢
      • 1970-01-01
      • 2018-01-11
      • 2014-09-19
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      相关资源
      最近更新 更多