jose4j JwtConsumer 的验证密钥

Verification key for jose4j JwtConsumer

我正在使用 jose4j 来验证和处理 JWT。 JWT 如下所示,并通过了 JWT 主页中的验证。

但是,我不能使用 jose4j java 库做同样的事情。异常抱怨我设置的验证密钥。但是库中定义了很多类型的键,我试过了但没有成功。代码如下:

import java.util.Map;

import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.InvalidJwtException;
import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
import org.jose4j.keys.HmacKey;

public class YGJWT {

    public static void main(String args[]) throws InvalidJwtException {

        String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ";
        String secret = "secret";

        JwtConsumer jwtConsumer = new JwtConsumerBuilder()
                .setVerificationKey(new HmacKey(secret.getBytes())) //what kind of key do i need to use it here?
                .build();


        JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);
        Map<String, Object> claimsMap = jwtClaims.getClaimsMap();

        claimsMap.forEach((String key, Object val) -> {
            System.out.println(key + ": " + val.toString());
        });

    }

}

感谢任何帮助。

我猜你会遇到这样的异常?

org.jose4j.lang.InvalidKeyException: A key of the same size as the hash output (i.e. 256 bits for HS256) or larger MUST be used with the HMAC SHA algorithms but this key is only 48 bits

HmacKeyHS256 的正确类型,但根据 https://www.rfc-editor.org/rfc/rfc7518#section-3.2 的第二段,密钥在技术上太短,它与异常消息具有相同的文本。

您可以通过使用 .setRelaxVerificationKeyValidation() 构建 JwtConsumer 来解决此问题,这将允许使用更短的密钥。

看起来像这样(仅向示例中的片段添加一行):

JwtConsumer jwtConsumer = new JwtConsumerBuilder()
     .setVerificationKey(new HmacKey(secret.getBytes())) 
     .setRelaxVerificationKeyValidation() 
     // allow shorter HMAC keys when used w/ HSxxx algs 
     .build();

一般来说,我会尽量避免使用像“secret”这样的密钥这样的短密码,并建议尽可能使用更强的密钥。