JWT,使用存储在 DB 中的动态密钥

Posted

技术标签:

【中文标题】JWT,使用存储在 DB 中的动态密钥【英文标题】:JWT, Using a dynamic secret key stored in DB 【发布时间】:2018-09-14 22:45:03 【问题描述】:

如果我继续采用以下方法,我需要一些关于未来陷阱和问题的建议。

我正在使用 JWT,当他/她更改密码时,我需要使用户之前的所有令牌过期。

我为每个用户制作唯一密钥的方法是连接我的密钥和用户密码 (config.jwtSecretKey + user.password) 以生成动态密钥。 一旦用户更改了他/她的密码,密钥就会改变,因此之前的所有令牌都将无效。

一切正常,但要验证每个令牌,我需要调用数据库来获取密码。

请建议我可以如何改进这一点或做同样事情的正确方法。

【问题讨论】:

您是否以纯文本格式保存密码? 不,我正在使用 bcrypt 加密密码。 【参考方案1】:

你的方法对KISSy来说非常好

可以通过使用一些动态密钥的内存缓存来减少数据库查询。

此外,您可以将动态密钥从 password hash 更改为 some random hash 以减少冲突。它将减少很多安全威胁。

【讨论】:

使用动态密钥的好处是,使用该哈希算法,您可以非常快速地提供单点登录,甚至可以在全球范围内提供,但如果您的算法被泄露(例如公司成员),您被搞砸了,或者如果它只是基于来自客户的密码或数据,那么他一方的违规行为也可能很危险。恕我直言,两者的混合可以提供非常好的身份验证:您只需请求可以缓存的数据库的少数字段,结合快速/不可预测的哈希算法,您可以提供非常快速有效的授权机制。

以上是关于JWT,使用存储在 DB 中的动态密钥的主要内容,如果未能解决你的问题,请参考以下文章

在 JWT 的配置文件中生成和使用密钥

如何安全地存储和处理 JWT 的密钥

JWT 是不是共享/存储用于在客户端和服务器上签名的密钥?

如何在 PHP 中检查没有密钥的 JWT 完整性?

为 JWT 生成密钥?

RFC 中 JWT 示例中使用的“密钥”是啥?