有关JWT的问题

时间:2018-10-03 17:48:46

标签: node.js express security jwt backend

所以我目前尝试使用nodejs jwt cookie设置“记住我”功能。 Here我找到了一个加密cookie的例子。我也阅读了他们的介绍。现在,我计划使用this中间件进行快速存储,以存储user_id以与mysql数据库进行标识。
我的问题是:

  • 在jwt站点上,当我更改机密时,只有一个调试器,如果使用机密对有效载荷进行加密,签名更改不会更加安全吗?
  • 该机密必须不是残酷的512、1024 2048个字符?
  • 秘密暴力发生多快?如果暴力破解很快,应该多久更改一次?
  • 使用上述模块保护令牌的最佳实践是什么?还有如何设置令牌(用法示例仅显示如何读取)?

我主要担心的是,当某人可以制作令牌时,他可以设置他的user_id并有权访问任何帐户。我希望有人能为我澄清一下。

1 个答案:

答案 0 :(得分:1)

问:在jwt站点上,当我更改密码时,只有一个调试器,如果使用密码对有效负载进行加密,签名更改是否会更加安全?

JWT的主要要求是它是经过数字签名的。如果将敏感数据放入JWT中,则还需要对其进行加密。但是我强烈建议您不要在其中放置敏感数据,因为如果用户丢失了他的JWT令牌,那么您希望将损失降到最低。例如,在OWASP juice shop Web应用程序(出于教人安全性的目的而故意不安全的Web应用程序)中,他们将用户的密码哈希放在了token /中。这样一来,攻击者就可以按照this blog中的演示,通过跨站点脚本来恢复用户密码。

问:密码必须不是残酷的512、1024 2048个字符吗?

取决于您使用的JWT算法。如果使用的是HMAC,则256位(32字节)足够多,远远超出了您的需要。如果您使用的是RSA,则最佳做法是使用2048位(256字节)。

问:秘密暴力破解有多快?如果暴力破解很快,应该多久更改一次?

在宇宙的整个生命周期中,如果量子计算机没有成为现实(如果量子计算机成为现实,那么所有赌注都将消失),使用星球上的所有计算机,这并不是蛮力的。密码学家是非常聪明的人,他们以这种方式设计这些算法。例如,如果您想了解RSA安全性,请先研究general number field sieve和攻击它的运行时间。 :-)这不是蛮力-蛮力是一种缓慢而愚蠢的攻击-而是基于模数的代数性质的智能算法。

因此,总而言之,请为您选择的算法使用建议的密钥大小,除非您有理由认为密钥已被破坏,否则不必担心旋转密钥。如果只有一个地方需要验证令牌,并且该地方与生成令牌的地方相同,那么HMAC是一个不错的选择。但是,否则,最好使用RSA之类的公钥算法。

问:使用上述模块保护令牌的最佳实践是什么?还有如何设置令牌(用法示例仅显示如何读取)?

由于将其放入Cookie中,请遵循Cookie的常规最佳做法(安全,HttpOnly等)。