加密,然后将访问令牌存储在 localStorage

Posted

技术标签:

【中文标题】加密,然后将访问令牌存储在 localStorage【英文标题】:Encrypting, then storing access token in localStorage 【发布时间】:2019-07-28 20:01:11 【问题描述】:

我的 API 在用户登录后返回访问令牌。

所有未来的请求都必须在 Authentication 标头中包含此令牌。

我希望用户即使关闭并重新打开浏览器也能保持登录状态。

我能否安全地将这个访问令牌的加密版本存储在 localStorage 中、检索它、在我的 React 客户端代码中解密它并将其发送到 API?

【问题讨论】:

可以,但如果您控制 API,您可能需要考虑使用基于 cookie 的存储并防止通过 CORS 进行访问。这可以防止 XSS 攻击获得对加密身份验证数据的访问权限。 nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/… security.stackexchange.com/questions/173620/… 我建议您远离本地存储以保留敏感信息,这不安全。在工作中,我们有一堆单页应用程序使用 cookie 来保存用户的访问令牌,这是一个更安全的解决方案。您可以在此链接中详细了解为什么我们应该使用 cookie 而不是本地存储来保存敏感信息:dev.to/rdegges/please-stop-using-local-storage-1i04 【参考方案1】:

当然,如果您喜欢 https://www.npmjs.com/search?q=keywords:encrypt,您可以使用类似 https://www.npmjs.com/package/aes-js 或其他库的内容。

我认为真正的问题是为什么?用户始终可以在开发工具的网络请求中看到未加密的值。如果访问令牌与用户拥有的用户名和密码相关联,为什么他们看不到它?这实际上只是编写用户名和密码的另一种方式。如果它与属于您的应用程序的用户名相关联(例如,您的服务器使用该用户名登录到另一台服务器的所有请求,而不仅仅是这个用户),那么您不应该将它传递给浏览器,因为它是容易偷走。

【讨论】:

这在攻击者窃取 JWT 令牌的情况下很有用,因此您可以安全地保存其信息。在这种情况下,尽可能多地隐藏数据。 所以加密令牌可能有助于防止某些 XSS 攻击? 如果您使用的是 JWE 令牌,用户将无法在网络请求中看到令牌的内容。因此,我认为加密 JWE 令牌并将其存储在本地存储中是一个不错的选择。我们可以使用 dotenv 将密钥存储在 env 文件中。这里的想法是防止恶意用户从本地存储中窃取您的 jwe 令牌并冒充您。我在安全方面很天真。只是分享我的想法。如果我错了,有人可以纠正我吗?

以上是关于加密,然后将访问令牌存储在 localStorage的主要内容,如果未能解决你的问题,请参考以下文章

如何在React库的LocalStorage中存储令牌

访问令牌是不是加密

将 WebAPI JWT 访问令牌作为加密的 FormsAuthenticationTicket 存储在 Response.Cookies 中是不是安全(在 asp.net mvc 中)

localStorage 需要时间在反应中存储令牌

使用 Http 和 Secure 将 Jwt 令牌存储在 Cookie 中,而不是 Javascript 中的 LocalStorage

访问/刷新令牌混淆