jose4j JwtConsumer 的验证密钥

Posted

技术标签:

【中文标题】jose4j JwtConsumer 的验证密钥【英文标题】:Verification key for jose4j JwtConsumer 【发布时间】:2015-10-25 02:31:31 【问题描述】:

我正在使用 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());
        );

    


感谢任何帮助。

【问题讨论】:

【参考方案1】:

我猜你会得到一个类似这样的异常? 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 来解决此问题,这将允许更短的密钥。看起来像这样(在您的示例中仅向 sn-p 添加一行):

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

一般来说,虽然我会尽量避免使用短密码,如“secret”之类的密钥,并建议尽可能使用更强的密钥。

【讨论】:

很高兴我能帮上忙,感谢您使用the jose4j JWT library! @BrianCampbell 如果我可以在这里问-;) 当我尝试获取 JWT 令牌时出现异常' 原因:java.security.InvalidKeyException:没有安装的提供程序支持此密钥:sun.security .rsa.RSAPrivateCrtKeyImpl @AdetiloyePhilipKehinde,查看bitbucket.org/b_c/jose4j/issues/51/…的评论

以上是关于jose4j JwtConsumer 的验证密钥的主要内容,如果未能解决你的问题,请参考以下文章

使用由 jose4j 生成的令牌在 node.js 中使用 jsonwebtoken 验证 JWT 失败

为啥我的 Jose4j JSON Web Key 会导致这个 InvalidKeyException?

重启服务器后JWT失效

检索 JWT 身份验证的证书/密钥时出现问题。 (节点/Express/C#/IdentityServer)

Json Web 令牌 - jose4j - SyntaxError:JSON 中位置 0 的意外令牌 e

使用 pysftp 验证主机密钥