为啥 JSON Web Token (JWT) 在不知道密钥的情况下解密

Posted

技术标签:

【中文标题】为啥 JSON Web Token (JWT) 在不知道密钥的情况下解密【英文标题】:Why JSON Web Token (JWT) Decrypt with out knowing Secret Key为什么 JSON Web Token (JWT) 在不知道密钥的情况下解密 【发布时间】:2018-09-05 07:11:23 【问题描述】:

我正在使用智威汤逊。为了加密令牌,我在 Java 中使用带有 base64EncodedSecretKey 的 HS512 签名算法。获得令牌后,我可以在不知道密钥的情况下解密令牌。这怎么可能?我的令牌有什么问题吗?

String JWT = Jwts.builder()
  .signWith(SignatureAlgorithm.HS512, SECRET)
  .setSubject(username)
  .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
  .setAudience("ADMIN")
  .compact();

这里JWT是我的令牌,我通过调用这个方法来设置密钥:

signWith(SignatureAlgorithm.HS512, SECRET)

字符串SECRET是我的钥匙。

但是当我通过邮递员使用正确的用户名和密码发出请求时,我在标题中收到了这个令牌:

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTUyMjkyMjAzOSwiYXVkIjoiQURNSU4ifQ.Wye52RTz8P3_7gPxZnJHOArA-ixaNHhQEcfoiAELu_56WXmMcZEAOlUyqP8yI0CWOZ4deXFRcP6azBpZpwNt-w

当我解密它时,我可以查看令牌数据:


  alg: "HS512"
.

   sub: "admin",
   exp: 1522922039,
   aud: "ADMIN"

所以我的问题是:如何在不知道我的密钥的情况下解密 JWT?

【问题讨论】:

您的令牌未加密,仅经过签名。您只需要密钥来验证签名。 愿此帮助***.com/questions/27301557/… 谢谢你,Robby Cornelissen 和 jmw5598 【参考方案1】:

为了加密令牌,我使用 HS512 签名算法 [...]

不,您没有加密令牌。您正在签署它。

获得令牌后,我可以在不知道密钥的情况下解密令牌 [...]

不,您没有解密令牌有效负载。您正在解码它。

令牌负载是一个编码为 Base64 的 JSON 字符串,解码它不需要密钥。


JSON Web Token (JWT) 是一个开放标准,它定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象的形式安全传输信息。

JWT 是以下类型令牌的通用名称

JSON Web Signature (JWS):负载经过编码和签名,因此可以验证声明的完整性

JSON Web Encryption (JWE):它们的有效载荷经过加密,因此声明对其他方隐藏

图片是从这个page中提取的。

【讨论】:

感谢 Cassio Mazzochi Molin,这对我很有帮助。【参考方案2】:

JWT Token 有 3 个部分,由 .(点)分隔。第一部分标题,第二部分是有效负载,第三部分是签名。 Header 和 Payload 使用 Base64Url(Base64 的小变体)进行编码。这可以被任何人解码。重要的部分是签名。 为了对令牌进行签名,使用了一种哈希算法,该算法将标头、有效负载和一个秘密(密码)作为参数并生成一个哈希值。此哈希附加在 jwt 令牌中,因为第三个字段用作签名。

服务器将此令牌作为“授权承载”标头接收。它使用标头、有效负载和秘密密码计算哈希。如果此计算的哈希与令牌中存在的哈希匹配,则可以确保在旅行时没有人更改令牌。如果不匹配,则令牌无效。秘密起着非常重要的作用。如果这被盗,人们可以生成相同的签名。 参考——https://blog.angular-university.io/angular-jwt/

【讨论】:

以上是关于为啥 JSON Web Token (JWT) 在不知道密钥的情况下解密的主要内容,如果未能解决你的问题,请参考以下文章

JWT(JSON Web Token)

JWT -- JSON WEB TOKEN

JWT -- JSON WEB TOKEN

Json Web Token(JWT)

JWT(Json WEB Token)

Json Web Token(JWT)详解