2015-05-13 121 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");