java - jose4j JwtConsumer 的验证 key

标签 java jwt jose4j

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

但是,我无法使用 jose4j java 库执行相同的操作。异常提示我设置的验证 key 。但是库中定义了很多类型的键,我试过了但没有成功。代码如下:

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 的第二段, key 在技术上太短了与异常消息具有相同的文本。

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

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

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

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

关于java - jose4j JwtConsumer 的验证 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31779585/

相关文章:

java - 作业 编写一个测试程序,提示用户输入一个整数并报告该整数是否为回文

java - 使用多线程更快地读取文件

java - 如何检查一个字符串是否同时包含字母和数字?

django rest 框架 jwt 身份验证与电子邮件和密码

authentication - JWTSecurityTokenHandler.ValidateToken() 何时真正有效?

java - 如何使用提供的 .cer 文件解码 JWT RS256 token ?

java - Chrome驱动程序空指针异常

spring-boot - 只能为 HMAC 签名指定 Base64 编码的 key 字节

java - 如何在 jose4j 中从 X.509 PEM 证书生成 JWK?

cryptography - 如何从生成的 ecdsa key 填充 jsonwebkey