为什么JSON Web令牌(JWT)解密而不知道密钥

时间:2018-03-27 02:09:59

标签: java jwt

我正在使用JWT。要加密令牌,我在Java中使用HS512签名算法和base64EncodedSecretKey。获得令牌后,我能够在不知道密钥的情况下解密令牌。这怎么可能?我的令牌有什么问题吗?

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是我的关键。

但是当我通过postman用正确的user_name和密码发出请求时,我在标题中收到了这个令牌:

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTUyMjkyMjAzOSwiYXVkIjoiQURNSU4ifQ.Wye52RTz8P3_7gPxZnJHOArA-ixaNHhQEcfoiAELu_56WXmMcZEAOlUyqP8yI0CWOZ4deXFRcP6azBpZpwNt-w

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

{
  alg: "HS512"
}.
{
   sub: "admin",
   exp: 1522922039,
   aud: "ADMIN"
}

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

2 个答案:

答案 0 :(得分:5)

  

加密令牌我正在使用HS512签名算法[...]

不,您不是加密令牌。您签名

  

获得令牌后,我能够在不知道密钥[...]

的情况下解密令牌

不,您不是解密令牌有效内容。你解码它。

令牌有效负载是一个编码为Base64的JSON字符串,无需密钥即可对其进行解码。

JSON Web Token(JWT)是一个开放标准,它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。

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

  • JSON Web Signature(JWS):对有效负载进行编码和签名,以便验证声明的完整性

  • JSON Web Encryption(JWE):他们的有效负载已加密,因此声明隐藏来自其他方。

JWT, JWS and JWE
图像是从page

中提取的

答案 1 :(得分:2)

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

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