在本地存储中存储凭据

时间:2011-10-22 13:45:13

标签: javascript security html5 encryption local-storage

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

我是否需要存储加密的哈希?

编辑:这是否足够安全?

  • 用户登录。

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

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

4 个答案:

答案 0 :(得分:18)

localstorage与JavaScript一样容易被JavaScript读取。

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

但是对于cookie来说这是相同的,但通常将cookie设置为HTTPOnly,因此JavaScript无法读取它。

在任何一种情况下,无论如何都不应将纯文本登录信息存储在cookie或localstorage中,就像有人确实抓住它们一样,他们可以不断为自己创建一个新的会话。

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

答案 1 :(得分:10)

如果您要使用本地存储,为什么要存储用户凭据或从中获取的任何内容?

我一直在做的是:

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

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

这样,就没有关于从本地存储中暴露用户凭证的风险。但是,如果此临时唯一字符串基本上用作sessionID,您仍需要了解并预防与会话劫持相关的风险。

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

答案 2 :(得分:5)

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

你应该有一些方法来使这种令牌失效,否则一旦被盗,这种令牌就可以被用来代替真正的凭证。

答案 3 :(得分:0)

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