我正在使用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?
要加密令牌我正在使用HS512签名算法[...]
不,您没有加密令牌.你正在签名.
获得令牌后,我能够在不知道密钥的情况下解密令牌[...]
不,您没有解密令牌有效负载.你正在解码它.
令牌有效负载是编码为Base64的JSON字符串,并且不需要密钥来解码它.
JSON Web Token(JWT)是一种开放标准,它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息.
JWT是以下类型令牌的通用名称:
JSON Web签名(JWS):对有效负载进行编码和签名,以便验证声明的完整性.
JSON Web加密(JWE):它们的有效负载是加密的,因此声明对其他方隐藏.
图像是从此页面中提取的.