10

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

    }

}

任何帮助表示赞赏。

4

1 回答 1

10

我猜你会得到一个这样的异常? 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

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

JwtConsumer您可以通过构建with来解决它.setRelaxVerificationKeyValidation(),这将允许更短的键。看起来像这样(仅在示例中的代码段中添加一行):

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

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

于 2015-08-03T15:18:44.957 回答