jose4j JwtConsumer的验证密钥

时间:2015-08-03 04:46:06

标签: java jwt jose4j

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

但是,我不能使用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 个答案:

答案 0 :(得分:7)

我猜你是否会得到这样的例外情况? 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的正确类型,但根据http://tools.ietf.org/html/rfc7518#section-3.2的第二段,其密钥在技术上太短,该段与异常消息具有相同的文本。

您可以通过使用JwtConsumer构建.setRelaxVerificationKeyValidation()来解决此问题,这将允许更短的密钥。看起来像这样(在示例中只向一个片段添加一行):

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

一般情况下,虽然我会尽量避免使用短密码,例如&#34; secret&#34;并建议尽可能使用更强的密钥。