我遇到的关于实现魔术链接身份验证(在 Node 中)的教程推荐了这样的机制:
- 用户使用他们的电子邮件地址点击您的端点
- 您使用常量密钥从电子邮件和日期生成签名的 JWT(如果您更精明,则使用非对称
RS256方案而不是HS256大多数教程中使用的对称方案(我认为是默认方案)) - 使用令牌作为查询参数发送电子邮件
- 用户点击,端点被命中,你验证 JWT,然后是里面的电子邮件和日期
为可能非常小的大脑问题道歉,但为什么我们实际上需要散列或加密呢?
只生成一个大(如 50 个字符)、唯一、随机、字母数字字符串(我们称之为
LURA)然后存储它、电子邮件和日期并将其发送给用户不是更谨慎吗?当验证端点被击中时,我们可以说,“是的,我有那个东西,我在 2 分钟前发布了它,你去吧”。使用 JWT 的目的是验证我是创建令牌的人(使用我的密钥),但我也可以验证我是否只是查看LURA文件中是否有字符串,对吗?另外,JWT 也有问题。我有一种感觉,当验证 JWT 的机器与发出它的机器不同并且在这种情况下它的使用对安全性有害时,就可以使用 JWT。额外问题:我已多次阅读有关加密密码的内容,这在2020 年
SHA256太弱了,应该选择。如果它“被理解为带有 RSA 2048 位密钥的 SHA 256”,那么为什么这是一个不错的选择。Argon2RS256