gpt4 book ai didi

java - 验证 JsonWebToken 签名

转载 作者:行者123 更新时间:2023-12-02 09:36:41 29 4
gpt4 key购买 nike

我收到了 JWT,并想验证它的签名。它未加密,基于 64 编码并使用 HmacSha256 签名。它是用我知道的 secret 签名的。

我似乎找不到任何关于如何在不使用 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 );
}

最佳答案

JWT 具有以点分隔的 base64url 编码的三个部分

header.payload.signature

签名是通过header.payload计算的

假设你的方法接收到base64url中的元素,你需要在header + "."上计算HMAC。 + data,将结果编码为base64url,并与签名字段进行比较

类似这样的事情:

private boolean validateSignature( String header, String data, String signature, String secretKey ) throws Exception {

SecretKeySpec secret = new SecretKeySpec( secretKey.getBytes(), "HmacSHA256" );
Mac mac = Mac.getInstance( "HmacSHA256" );
mac.init( secret );

String body = header + "." + data;
byte[] hmacDataBytes = mac.doFinal( body.getBytes( StandardCharsets.UTF_8.name()) );
String hmacData = Base64.getUrlEncoder().encodeToString( hmacDataBytes );

return hmacData.equals( signature ); // Compare signatures here...
}

关于java - 验证 JsonWebToken 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51280084/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com