为啥 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) 在不知道密钥的情况下解密的主要内容,如果未能解决你的问题,请参考以下文章