【发布时间】:2016-06-24 17:04:19
【问题描述】:
我见过人们通过以某种方式结合用户密码、上次注销时间和共享密钥来实现无效的 JWT 令牌,并将其用作该用户的 JWT 密钥。这样一来,更改密码或注销就会有效地使所有现有令牌失效。
我的问题是
这是一个合理/好的设计吗?
如果是,如何我应该将这三个值组合到新密钥中以确保不会发生任何不良情况(我对密码学完全陌生)?
【问题讨论】:
标签: web-services security hash cryptography jwt
我见过人们通过以某种方式结合用户密码、上次注销时间和共享密钥来实现无效的 JWT 令牌,并将其用作该用户的 JWT 密钥。这样一来,更改密码或注销就会有效地使所有现有令牌失效。
我的问题是
这是一个合理/好的设计吗?
如果是,如何我应该将这三个值组合到新密钥中以确保不会发生任何不良情况(我对密码学完全陌生)?
【问题讨论】:
标签: web-services security hash cryptography jwt
您应该以 bcrypt 的格式存储密码 - 您不应将密码本身用作内存中保存的任何类型的密钥。
如果您使用 bcrypt 哈希的密码进行交换,那么这没问题,或者更好的是,您可以简单地存储并使用上次密码更改的日期/时间。如果您希望节省存储要求,您可以在注销时更新“最后更改日期”或密码更改。
请注意,这种设置意味着您不能支持每个帐户的多个会话,就像一个会话被注销一样,该用户帐户下的所有会话也将被注销。
总体而言,这似乎是一种在服务器端使令牌无效的好方法,因为秘密只是以HMAC 中的键控散列的一部分结束。
您可以使用实际密钥对 last_update_date 进行 SHA-224 处理以获取要使用的密钥。
例如
secret = sha-224(last_update_time || ":" || static_secret)
但是,由于您将在每个请求上检查数据库,这在很大程度上破坏了 JTW 的所有优势 - 请参阅 this answer。
【讨论】: