魔术链接:JWT 与随机字符串

信息安全 验证 jwt 一次性密码 节点.js
2021-08-31 14:09:19

我遇到的关于实现魔术链接身份验证(在 Node 中)的教程推荐了这样的机制:

  1. 用户使用他们的电子邮件地址点击您的端点
  2. 您使用常量密钥从电子邮件和日期生成签名的 JWT(如果您更精明,则使用非对称RS256方案而不是HS256大多数教程中使用的对称方案(我认为是默认方案))
  3. 使用令牌作为查询参数发送电子邮件
  4. 用户点击,端点被命中,你验证 JWT,然后是里面的电子邮件和日期

为可能非常小的大脑问题道歉,但为什么我们实际上需要散列或加密呢?

  1. 只生成一个大(如 50 个字符)、唯一、随机、字母数字字符串(我们称之为LURA)然后存储它、电子邮件和日期并将其发送给用户不是更谨慎吗?当验证端点被击中时,我们可以说,“是的,我有那个东西,我在 2 分钟前发布了它,你去吧”使用 JWT 的目的是验证是创建令牌的人(使用我的密钥),但我也可以验证我是否只是查看LURA文件中是否有字符串,对吗?另外,JWT 也有问题我有一种感觉,当验证 JWT 的机器与发出它的机器不同并且在这种情况下它的使用对安全性有害时,就可以使用 JWT。

  2. 额外问题:我已多次阅读有关加密密码的内容,这在2020 年SHA256太弱了,应该选择如果它“被理解为带有 RSA 2048 位密钥的 SHA 256”,那么为什么这是一个不错的选择。Argon2RS256

2个回答

只生成一个大的 ... 字符串不是更谨慎吗?

是的,它会的。令牌通常是一个简单的解决方案,并且更容易正确。加密解决方案通常存在缺陷或需要完全正确实施以确保安全。随机令牌更安全,因为它们更简单。

JWT 在拥有多个系统时特别有用:如果一个系统提供访问另一个系统的令牌,并且它们无权访问同一个数据库。

SHA256 在 2020 年太弱了

SHA256 仍然被认为是一种安全的通用哈希函数。问题是通用哈希函数不适合加密密码,因为它们太快了。由于普通计算机每秒可以计算数十亿次 SHA256 哈希,因此每秒可以使用数十亿次猜测来破解密码。

但是,在 JWT 中,SHA256 不是用于密码,而是用于消息的完整性,因此速度快不是问题。没什么好猜的。

确实,您可以为魔术链接使用随机字符串,它会正常工作。然而,选择使用 JWT 实现它有一些好处:

  1. JWT 验证不需要调用数据库。这也许是使用 JWT 的主要好处。根据用户的数量,这可能意味着显着的性能差异。
  2. 与已经处理创建/验证/存储令牌的现有登录机制(例如身份提供者(可能是第 3 方))集成更容易。这很有用,例如,如果您的应用程序已经使用令牌来使用传统的用户名/密码组合登录用户,并且想要添加魔术链接作为附加选项。

至于您对算法的问题,对于 JWT 中的 RS256/HS256,目的不是加密而是签名对安全加密和签名算法的要求是不同的(如果谈到密码散列,则更加不同)。

作为附加说明,在 RS256 和 HS256 之间进行选择的原因是您是否打算允许其他人验证您的令牌。

对于 RS256,您创建一个公钥/私钥对。您使用私钥生成签名,而第三方可以验证您使用公钥创建的令牌。对于 HS256,用于签名和验证的密钥是相同的,因此通常您将其保密,这意味着只有您可以验证令牌。