database - 我是否需要对存储在数据库中的刷新 token 进行哈希处理?

标签 database go hash jwt-auth

我正在使用后端和基于JWT的身份验证中使用Go的Web应用程序。当用户登录时,我向他们发送访问 token (具有较短的到期时间)和刷新 token (具有较长的到期时间)。这两个 token 都包含username作为其有效负载。它们是用不同的 secret 创建的。我的问题是关于注销。当用户发送注销请求时,我想使其刷新 token 无效,以便注销后需要他们再次登录。为了解决问题,我将刷新 token 存储在数据库的黑名单表中。我的问题是,在将刷新 token 存储在数据库中之前,是否需要对它进行哈希处理。谢谢。

最佳答案

JWT的标准声明(RFC 7519 §4.1.7)之一是"jti",它是 token 的唯一标识符。如果在刷新 token 中包含唯一标识符,则足以将"jti""exp"(到期)声明存储在数据库中。 (我默认使用 ("github.com/satori/go.uuid").NewV4 生成"jti"作为随机UUID,并且在内部由"crypto/rand"随机数生成器提供支持。)

现在,如果提供了刷新 token ,则可以进行常规检查以确保其正确签名和未过期,然后在数据库中查找"jti"。如果它不在黑名单中,那么它很适合重用。您只需要在数据库中保留"exp"即可知道何时安全清除记录。由于"jti"只是一个随机标识符,因此您无法从"jti"返回任何可识别的信息,因此无需特别对其进行哈希处理或加密。

如果您没有"jti"并且无法添加一个,则我可能会对该 token 进行哈希处理,或者只是保留声明的副本。部分原因是出于空间原因,部分原因是您不想存储实际上是有效凭证的内容。保留足够的信息,以便您可以唯一地标识 token ;可能"sub""exp"时间在一起是足够的信息(如果发给同一主题的两个 token 在同一秒到期,则无法区分)。

关于database - 我是否需要对存储在数据库中的刷新 token 进行哈希处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60918317/

相关文章:

database - 提高informix中sql的性能

database - 在 RoR 中清空我的 Sqlite3 数据库

database - PostgreSQL 临时表是否已经注销?

go - 在 go 中迭代 2D slice

security - 是否可以识别哈希类型?

mysql - 从 MySQL 表中选择最后 20 个最新的唯一 URL

xml - 在 golang 中,如何对包含空格的 xml 参数进行编码?

go - Websocket 等待超时消息

mongodb - 总是产生相同哈希的无序 2 字符串哈希函数

ios - 在 Swift 中打乱字符串