使用 JWT 进行身份验证时是不是可以消除私钥攻击向量?

Posted

技术标签:

【中文标题】使用 JWT 进行身份验证时是不是可以消除私钥攻击向量?【英文标题】:Is it possible to eliminate private key attack vector when using JWTs for authentication?使用 JWT 进行身份验证时是否可以消除私钥攻击向量? 【发布时间】:2019-12-21 07:20:57 【问题描述】:

我设想以下使用 JWT 的身份验证方案:

客户端使用 userName, password /login API 端点进行身份验证 服务器根据存储的散列凭据验证用户名+密码,并颁发带有一组声明的 JWT 令牌,并使用私钥进行签名 然后客户端使用颁发的 JWT 令牌来验证对 API 的任何后续调用,而服务器验证令牌并仅根据提供的令牌中存在的声明应用授权规则(无状态)

签名密钥必须存储在服务器上,它会创建一个非常有价值的攻击向量。

获得私钥访问权限的潜在攻击者可以生成带有任何声明集的 JWT,冒充任何用户,并可能提取他们的所有数据 - 无需知道密码。

如何使用 JWT 进行(无状态)身份验证,同时消除攻击者使用窃取的私钥冒充任何用户而不知道其密码的风险?

【问题讨论】:

【参考方案1】:

这个问题应该移到https://security.stackexchange.com。 answers 有很多类似的问题。

当从“签名密钥必须可用”到“可用”意味着它“存储在服务器上”到“攻击者可以获取密钥的访问权限”时,您做出了许多假设。当然,如果您将私钥存储在具有公共读取的文件系统上的纯文本文件中,这是一种威胁模型。如果你有钥匙,比如说,一个完全不同的动物的 HSM。

广泛的答案:有许多密钥管理最佳实践。比如OWASP cheatsheet有一些建议:

开发人员必须了解加密密钥的存储位置 应用程序。了解存储密钥的存储设备 在。 易失性和持久性内存中的密钥必须受到保护, 理想地在安全加密模块中处理。 键应该 永远不会以纯文本格式存储。 确保所有密钥都存储在 加密保险库,例如硬件安全模块 (HSM) 或 隔离加密服务。

...等等。

您还可以通过考虑更良性的密钥轮换用例,为密钥被盗的最坏情况做好准备。

【讨论】:

以上是关于使用 JWT 进行身份验证时是不是可以消除私钥攻击向量?的主要内容,如果未能解决你的问题,请参考以下文章

SSH 使用公钥(不是私钥)进行身份验证

使用 vertx 在 JWT 公钥/私钥身份验证中握手

使用带有 KONG API 网关的 cookie 进行 JWT 身份验证

Refresh-Token (JWT) 如何避免中间人攻击?

使用 JWT - 以他们的电子邮件为主题对用户进行身份验证是不是可以?

在 Kong API 网关中使用 .jks 密钥对 JWT 令牌进行身份验证