将访问令牌和刷新令牌保存到本地存储但已加密?

Saving access token and refresh token to local storage but encrypted?

提问人:asallan3 提问时间:2/1/2023 最后编辑:Pavel Gatilovasallan3 更新时间:7/5/2023 访问量:240

问:

我一直在研究使用 ReactJS 进行前端开发,并使用 ASP.NET Core 进行后端开发,作为第一步,我一直在开发身份验证/授权(登录)系统。

我实现了在 1 小时后过期的访问令牌和在 7 天后过期的刷新令牌,或者在请求新的访问令牌时(以换取旧的访问令牌和有效的刷新令牌)。

我试图听从人们的建议并使用 cookie 作为刷新令牌,但我一直在为此苦苦挣扎,我的 API 只会从 cookie 中获得相同(旧的/过期的)刷新令牌......因此,我决定在刷新访问令牌时将刷新令牌和访问令牌作为 json 发送。HttpOnly

在前端,我使用包将两个令牌保存在 Cookie(非 HttpOnly)上,但在保存之前我使用 AES 256 位对它们进行加密。我被告知 Cookie(非 HttpOnly)容易受到 XXS 攻击,但我想知道我的令牌有多脆弱,因为我使用美国联邦信息处理标准使用私钥加密它们?js-cookielocalStorage

安全 加密 客户端攻击

评论

2赞 Juraj Martinka 2/1/2023
如果它们被加密,前端如何使用它们?解密发生在哪里?
0赞 asallan3 2/1/2023
@JurajMartinka前端加密和解密。当我收到令牌时,我会加密并将它们保存到 cookie 中。当我想使用时,我从 cookie 中获取它们并解密。但是,如果攻击者设法从XSS攻击中的cookie访问它们,例如,它们将被加密
0赞 Juraj Martinka 2/2/2023
如果要对令牌进行加密/解密,则加密密钥存储在哪里。听起来最终用户或攻击者可以轻松访问它。
0赞 asallan3 2/3/2023
@JurajMartinka它位于导出的常量上
0赞 Juraj Martinka 2/7/2023
它比以明文形式存储令牌更安全吗?第三方脚本可以使用与 JavaScript 前端相同的方法轻松解密它。

答:

0赞 Pavel Gatilov 7/5/2023 #1

正如 juraj-martinika 所暗示的那样,使用客户端存储密钥的客户端加密无法使任何事情变得更加安全。在应用程序级别,任何加密的挑战都不是加密过程,而是密钥管理过程。您的加密数据与密钥存储一样安全。如果您将密钥存储在 JS 文件、JS 变量或本地/会话存储中的常量中 - 获取加密数据就像根本没有加密一样容易。

关于可用于实现安全令牌管理的模式,有一个很好的主题:在客户端上存储刷新令牌的什么位置?看看什么可以对您的情况有所帮助。

如果您可以使用 cookie - 我会恢复到它们,但可以解决过时的问题。

评论

0赞 Pavel Gatilov 7/5/2023
题外话,但对于 cookie - 您可能在刷新时错过了 cookie 更新。确保当访问令牌过期并颁发新令牌时,后端会发送另一组 Set-Cookie 标头,以便在浏览器中更新 Cookie。