JWT 代币设计

Design for JWT token

我见过有人通过以某种方式组合用户密码、上次注销时间和共享机密来实现可失效的 JWT 令牌,并将其用作该用户的 JWT 机密。这样,更改密码或注销会有效地使所有现有令牌失效。

我的问题是

  1. 这是reasonable/good设计吗?

  2. 如果是,我应该如何将这三个值组合到新的秘密中以确保没有坏事发生(我对密码学完全陌生)?

您应该以 bcrypt 格式存储密码 - 您不应将密码本身用作内存中保存的任何类型的密钥。

如果您使用 bcrypt 散列的密码进行交换,那么这没问题,或者更好的是,您可以简单地存储和使用上次密码更改的 date/time。如果您希望保存存储要求,您可以在注销 密码更改时更新 "last change date"。

请注意,这种设置意味着您不能支持每个帐户的多个会话,就好像一个会话已注销一样,该用户帐户下的所有会话也将如此。

总的来说,这似乎是使服务器端令牌无效的好方法,因为秘密只是在 HMAC.

中作为键控哈希的一部分结束。

您可以使用实际秘密对 last_update_date 进行 SHA-224 运算以获取要使用的密钥。

例如

secret = sha-224(last_update_time || ":" || static_secret)

但是,由于您将在 每次 请求时检查数据库,这在很大程度上会破坏 JTW 的所有优势 - 参见 this answer