2015-05-13 89 views
3

基于nimbus-jose-jwt Java库,我尝试创建以下JSON Web令牌(JWT)并使用JSON Web签名(JWS)使用字符串“secret”对SHA256进行散列签名。Java中生成的JSON Web签名产生无效签名

但是在生成序列化字符串并在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(); 
+0

验证JWT当你在使用的秘诀是什么? – frasertweedale

+0

@frasertweedale我正在使用第三方python库“pyjwt”,代码是:payload = jwt.decode(request.body,'secret',algorithms = ['HS256']) –

+0

好吧,好吧在我看来你正在使用“秘密”的SHA-256摘要作为创建MAC的密钥,以及用于验证的普通旧“秘密”。它是否与'JWSSigner签名者=新MACSigner(“秘密”)一起工作? – frasertweedale

回答

0

它看起来像你正在使用“秘密”的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");