我看到人们通过以某种方式组合用户的密码,上次注销时间和共享密钥来实现无效的JWT令牌,并将其用作该用户的JWT秘密。这样,更改密码或有效注销会使所有现有令牌无效。
我的问题是
这是一个合理/好的设计吗?
如果是,如何我应该将这三个值合并到新的秘密中以确保没有发生任何不良事件(我对密码学完全不熟悉)?
答案 0 :(得分:0)
您应该以bcrypt格式存储密码 - 您不应将密码本身用作内存中任何类型的密钥。
如果您使用密码替换bcrypt哈希,那么这没关系,或者甚至更好,您可以简单地存储和使用上次密码更改的日期/时间。如果您希望节省存储空间要求,可以使用最后一次更改日期"在密码更改时注销或时更新。
请注意,这种设置意味着您无法支持每个帐户的多个会话,就像一个会话已注销一样,该用户帐户下的所有会话也将支持。
总的来说,这似乎是令服务器端令牌无效的一种好方法,因为秘密只会导致HMAC中的密钥哈希的一部分。
您可以使用实际密码对last_update_date进行SHA-224以获取要使用的密钥。
e.g。
secret = sha-224(last_update_time || ":" || static_secret)
但是,正如您要在每个请求中检查数据库一样,这主要取消了JTW的所有优点 - 请参阅this answer。