【问题标题】:Generated JSON Web Signature in Java produce invalid signatureJava中生成的JSON Web签名产生无效的签名
【发布时间】: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 摘要。问题解决了。谢谢
  • 太棒了!我已将我的评论表述为答案。

标签: java jwt


【解决方案1】:

您似乎使用“秘密”的 SHA-256 摘要作为创建 MAC 的密钥,并使用普通的旧“秘密”进行验证。替换:

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");

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2019-08-11
    • 2017-10-27
    相关资源
    最近更新 更多