Java 为什么JSON Web令牌(JWT)在不知道密钥的情况下解密
我正在使用JWT。为了加密令牌,我正在使用HS512签名算法和Java中的base64EncodedSecretKey。在我得到令牌后,我可以在不知道密钥的情况下解密令牌。这怎么可能?我的代币有什么问题吗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
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,这对我很有帮助。