【发布时间】:2018-12-19 04:13:56
【问题描述】:
我收到一个 JWT 并想验证它的签名。 它未加密,采用 base64 编码并使用 HmacSha256 进行签名。 它是用我知道的秘密签名的。
我似乎找不到任何不使用https://jwt.io/ 上列出的第三方库(即 java-jwt、jpose4j 等)来验证签名的示例......
可以这样做吗?
到目前为止我所拥有的:
private boolean validateSignature( String header, String data, String signature, String secretKey ) throws Exception {
Base64 base64 = new Base64( true );
SecretKeySpec secret = new SecretKeySpec( secretKey.getBytes(), "HmacSHA256" );
Mac mac = Mac.getInstance( "HmacSHA256" );
mac.init( secret );
byte[] hmacDataBytes = mac.doFinal( data.getBytes( StandardCharsets.UTF_8.name()) );
String hmacData = new String( hmacDataBytes );
return hmacData.equals( signature ); // Compare signatures here...
}
基于@pedrofb 和@jps 的答案,这里是解决方案:
private boolean validToken( String authToken, String key ) throws Exception {
String[] token = authToken.split( "\\." );
String header = token[0];
String payload = token[1];
String originalSignature = token[2];
SecretKeySpec secret = new SecretKeySpec( Base64.getDecoder().decode( key ), ALGORITM_HMACSHA256 );
Mac mac = Mac.getInstance( ALGORITM_HMACSHA256 );
mac.init( secret );
StringBuilder headerAndPayload = new StringBuilder( header ).append( "." ).append( payload );
byte[] signatureBytes = mac.doFinal( headerAndPayload.toString().getBytes( StandardCharsets.UTF_8.name() ) );
String calculatedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString( signatureBytes );
return calculatedSignature.equals( originalSignature );
}
【问题讨论】:
标签: java jwt digital-signature