JWT 身份验证方案中的刷新令牌是不是应该使用与访问令牌不同的秘密进行签名?

Posted

技术标签:

【中文标题】JWT 身份验证方案中的刷新令牌是不是应该使用与访问令牌不同的秘密进行签名?【英文标题】:Should Refresh Tokens in JWT Authentication Schemes be Signed with a Different Secret than the Access Token?JWT 身份验证方案中的刷新令牌是否应该使用与访问令牌不同的秘密进行签名? 【发布时间】:2020-11-15 10:00:49 【问题描述】:

我有一个非常简单的问题,基本上如标题所述。

在实施包含短期访问令牌和长期刷新令牌的 JWT 身份验证方案时,这两种令牌类型是否应该使用不同的机密进行签名?

我最近一直在了解有关此身份验证方案的更多信息,在阅读过程中,我没有对此问题提出强烈的意见或结论性的答案。一些简短的谷歌搜索和 Stack Overflow 搜索也没有产生任何有意义的答案。

感谢您的宝贵时间!

【问题讨论】:

这是一个很好的问题,让我想了很久。我还在加密论坛上问过,是否可以使用相同的秘密签署多少令牌有限制,因为它也可能与本次讨论相关:crypto.stackexchange.com/questions/82090/… 【参考方案1】:

回答:没有

为什么?

我们所说的 2 个令牌是

    访问令牌 刷新令牌

在密码学上,我知道 HMAC、RSA 或 ECDSA 的密钥使用没有上限。因此,使用相同的密钥签名是完全合理的,可以防止existential forgery。

但是,如果您的访问令牌和刷新令牌发布端点位于不同的服务器上,则从密钥管理安全的角度来看,您可能希望使用不同的密钥进行签名,以包含两个密钥之一的泄露。

【讨论】:

我接受这个答案是因为我觉得它最直接地解决了当前的问题,但鼓励将来查看此问题的任何人也查看 Marek Puchalski 的答案,因为它提出了另一个重要观点和一个很好的看法。谢谢两位的回答!【参考方案2】:

我的直觉告诉我将两个令牌的秘密分开。但不是因为安全原因。我的意思是,如果其中一个秘密泄露了,那么你就完成了。恕我直言,如果有一两个秘密,攻击面是相同的。

我将这些秘密分开的原因是可用性和错误预防。开发人员有时倾向于做一些愚蠢的事情,比如混合东西。有一天,开发人员将尝试发送一个刷新令牌来代替访问令牌。如果秘密不同 - 令牌将被简单地拒绝。如果秘密是一样的——接下来发生的事情超出了我的想象(所以我想防止这种情况发生)。

【讨论】:

【参考方案3】:

从加密方面我可以同意接受的答案。

但要考虑的一件事是,如果您使用相同的秘密,您应该关心如何验证刷新令牌。如果您只是检查 JWT 是否有效,则可以发送一个访问令牌作为刷新令牌,并从以前的有效访问令牌中获取一个新的访问令牌。

因此,您应该使用不同的机密或注意在 JWT 正文中指定和验证一个标志,指示这是访问令牌还是刷新令牌。

【讨论】:

以上是关于JWT 身份验证方案中的刷新令牌是不是应该使用与访问令牌不同的秘密进行签名?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django simple-jwt 令牌身份验证中获取后端中的当前刷新令牌

我是不是正确理解用于身份验证的访问和刷新令牌技术?

Angularjs 和 slim 框架 JWT 身份验证和令牌刷新流程

Laravel JWT 身份验证

如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?

在基于令牌的身份验证中使用刷新令牌是不是安全?