【发布时间】:2015-07-24 20:56:18
【问题描述】:
基于nimbus-jose-jwt Java 库,我尝试创建以下 JSON Web 令牌 (JWT) 并使用 JSON Web 签名 (JWS) 使用哈希到 SHA256 的字符串“secret”对其进行签名。
但在生成序列化字符串并在jwt.io 进行测试后,我总是收到错误“无效签名”。
当我尝试在服务器端使用 Python 解码器进行解码时,我也会收到签名错误。有什么问题?
byte[] bytes = new byte[32];
String message = "secret";
MessageDigest md = MessageDigest.getInstance("SHA-256");
bytes = md.digest(message.getBytes("UTF-8"));
JWSSigner signer = new MACSigner(bytes);
// Prepare JWT with claims set
JWTClaimsSet claimsSet = new JWTClaimsSet();
claimsSet.setSubject("alice");
SignedJWT signedJWT = new SignedJWT(new JWSHeader(JWSAlgorithm.HS256), claimsSet);
// Apply the HMAC
signedJWT.sign(signer);
// To serialize to compact form, produces something like
String s = signedJWT.serialize();
【问题讨论】:
-
你在验证 JWT 时使用什么作为秘钥?
-
@frasertweedale 我正在使用第 3 方 python 库“pyjwt”,代码是:payload = jwt.decode(request.body,'secret', algorithms=['HS256'])
-
好的,在我看来,您使用“秘密”的 SHA-256 摘要作为创建 MAC 的密钥,并使用普通的旧“秘密”进行验证。它适用于
JWSSigner signer = new MACSigner("secret")吗? -
@frasertweedale 我已经从 Java 端替换了我的库,主要问题是你所描述的,普通的旧“秘密”与“秘密”的 SHA-256 摘要。问题解决了。谢谢
-
太棒了!我已将我的评论表述为答案。