在 Java 中生成的 JSON Web 签名产生无效签名
Generated JSON Web Signature in Java produce invalid signature
基于 nimbus-jose-jwt Java 库,我尝试创建以下 JSON Web 令牌 (JWT) 并使用 JSON Web 签名 (JWS) 对其进行签名使用散列为 SHA256 的字符串 "secret"。
但是在生成序列化字符串并在 jwt.io 对其进行测试后,我总是得到错误 "Invalid Signature"。
当我尝试使用 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();
看起来您正在使用 "secret" 的 SHA-256 摘要作为创建 MAC 的密钥,并使用普通的旧 "secret" 进行验证。替换:
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);
与:
JWSSigner signer = new MACSigner("secret");
基于 nimbus-jose-jwt Java 库,我尝试创建以下 JSON Web 令牌 (JWT) 并使用 JSON Web 签名 (JWS) 对其进行签名使用散列为 SHA256 的字符串 "secret"。
但是在生成序列化字符串并在 jwt.io 对其进行测试后,我总是得到错误 "Invalid Signature"。
当我尝试使用 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();
看起来您正在使用 "secret" 的 SHA-256 摘要作为创建 MAC 的密钥,并使用普通的旧 "secret" 进行验证。替换:
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);
与:
JWSSigner signer = new MACSigner("secret");