Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JSON Web令牌(JWT)在不知道密钥的情况下解密_Java_Jwt - Fatal编程技术网

Java 为什么JSON Web令牌(JWT)在不知道密钥的情况下解密

Java 为什么JSON Web令牌(JWT)在不知道密钥的情况下解密,java,jwt,Java,Jwt,我正在使用JWT。为了加密令牌,我正在使用HS512签名算法和Java中的base64EncodedSecretKey。在我得到令牌后,我可以在不知道密钥的情况下解密令牌。这怎么可能?我的代币有什么问题吗 String JWT = Jwts.builder() .signWith(SignatureAlgorithm.HS512, SECRET) .setSubject(username) .setExpiration(new Date(System.currentTimeMilli

我正在使用JWT。为了加密令牌,我正在使用HS512签名算法和Java中的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
是我的密钥

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

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTUyMjkyMjAzOSwiYXVkIjoiQURNSU4ifQ.Wye52RTz8P3_7gPxZnJHOArA-ixaNHhQEcfoiAELu_56WXmMcZEAOlUyqP8yI0CWOZ4deXFRcP6azBpZpwNt-w
当我解密它时,我可以查看令牌数据:

{
  alg: "HS512"
}.
{
   sub: "admin",
   exp: 1522922039,
   aud: "ADMIN"
}
所以我的问题是:在不知道我的密钥的情况下,如何解密JWT

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

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

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

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

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


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

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

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

  • (JWE):它们的有效载荷是加密的,因此对其他方隐藏声明



该图像是从中提取的。

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

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

您的令牌未加密,只是经过签名。你只需要钥匙就可以验证签名了。谢谢你,Robby Cornelissen和JMW5598谢谢Cassio Mazzochi Molin,这对我很有帮助。