将 JWT 令牌用于“记住我”是否不如随机会话令牌安全?

信息安全 验证 饼干 jwt
2021-08-16 04:48:52

我正在阅读“ https://stormpath.com/blog/token-auth-spa ”和“ https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence ”(除其他外:-))我想避免的是盲目地使用我能想到的所有安全措施,只是为了感觉更安全。像散列哈希“以防万一”之类的东西。

我现在拥有的(通过 MEAN 示例的第 3 天)——我有 JWT 令牌(用户的 ID)+ 到期日期。所以令牌不会永远存在。此令牌存储为 cookie 以获得“记住我”功能。

这里让我烦恼的是缺少服务器添加到组合中的随机数据,所以安全,不安全,但它是非常确定性的设置(请参阅我链接的第二篇文章)。

所以我想知道 JWT 令牌是否不如“经典”会话令牌安全——我正在考虑这样的设置:

  • 用户登录,像以前一样创建 JWT 令牌,也创建会话令牌(id + 随机数),随机数的哈希存储在数据库中(当然设置了到期日期)
  • 对于正常工作,使用 JWT 令牌(它不用于“记住我”)
  • 会话令牌用于“记住我”,它存储为 cookie

当用户返回时,“记住我”会启动,而不是登录,使用带有会话令牌的 cookie 来授权用户,成功时会创建 JWT。

所以会有三个“层”:

  • 登录名+密码——时间无限使用
  • 会话令牌(“记住我”)——长期使用
  • JWT 令牌——短期使用,仅用于当前工作

我的问题是——我使用唯一 JWT 的第一种方法是否不太安全?或者换句话说 - 如上所述添加“会话令牌”是我让这个设置更安全还是只是让更多混乱?:-)

2个回答

JWT,如果散列和加密足够强,则与会话一样安全,并带来更低的开销。只要确保它保持小(尽管如果您正在做任何需要超过几 KB 存储的事情,您可能做错了什么......)。遵循 JWT 会话的最佳实践,你会没事的。

如果您使用足够强大的算法和足够强大的密钥,那么试图破解它的用户将非常不走运。如果他们确实破解了它,那么他们还必须找到一种方法来窃取其他人的 JWT cookie 以获取该信息(针对会话的相同类型的攻击)。

如果 JWT 不如会话安全,那么您的设计就错了,因为 JWT 是客户端会话。您将在会话中存储的所有内容都可以存储在这里。哎呀,您甚至可以在其中存储会话 ID,以跟踪数据库中不会在 JWT 中占有一席之地的较大事物。

正如罗伯特所说,如果 jwt 加密良好,它可以与会话一样安全。确保您使用的秘密非常独特。

警告:一些使用非对称密钥的 json Web 令牌库存在漏洞。

具有非对称密钥(RS256、RS384、RS512、ES256、ES384、ES512)的 node-jsonwebtoken、pyjwt、namshi/jose、php-jwt 或 jsjwt。这些是易受攻击的库,要修复它们,请确保您拥有它们的最新更新。

这个网站对 jwt 教育和测试很有帮助:https ://jwt.io/

此堆栈溢出答案解释了非对称与对称密钥:https ://stackoverflow.com/questions/32900998/jwt-keys-asymmetric-and-symmetric

这是我在 MEAN 应用程序中使用的包。“jsonwebtoken”:“^5.7.0”,“passport-jwt”:“^2.0.0”

passport.js 用于身份验证