JWS 签名如何确保令牌来自正确的发送者?

问题描述 投票:0回答:1

我目前正在研究客户端-服务器架构,其中客户端和服务器之间的所有通信都是使用 JWS 令牌进行的。

当接收者收到令牌时,它会从令牌本身检索公钥 URL 并验证签名。我对这个过程很困惑。如何确保公钥属于实际发送者?有可能不是篡改实际令牌,而是将整个令牌替换为另一个有效令牌。

我们假设发生中间人攻击的场景,攻击者使用自己的密钥对创建新的 JWS 令牌,然后用自己的密钥对替换实际令牌。在这种情况下,接收者将从令牌中获取公钥并成功验证签名(因为令牌仍然是有效的 JWS,但创建者不同)。

如果上述说法成立,那么我们如何才能认为 JWS 防篡改呢?如果有人可以篡改令牌,他们也可以完全替换令牌。而如果代币可以被替换,那么 JWS 的总体目的就落空了。

我相信我可能遗漏了一些重要的东西并且没有正确使用 JWS。请帮忙。

encryption oauth-2.0 jwt openid-connect encryption-asymmetric
1个回答
0
投票

您多次提到 JWS,但用 jwt 和 openid-connect 标记您的帖子,所以我假设您指的是 JWT 令牌,因为 JWS 只是签名。

客户端已向身份提供商 (IdP) 注册,因此当客户端请求 JWT 时,IdP 将在发出 JWT 之前验证客户端 ID(以及根据流程,客户端密钥)。这可以防止未知客户端生成有效的 JWT。

当接收者收到令牌时,它会从令牌本身检索公钥 URL 并验证签名。

那么服务器就没有按照规范正确实现 OIDC,因为签名本身不应该是公钥,而应该是可以使用公钥验证的计算出的 HMAC(请参阅rfc7515)。服务器应该有一个注册的 JWKS URI,它不应该从 JWT 本身获取它。它还应该验证发行者 (iss) 和受众 (aud) 声明。

© www.soinside.com 2019 - 2024. All rights reserved.