如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

2024-05-20

我想生成 JWT 并使用 HMAC_SHA256 对其进行签名。 对于该任务我必须使用jose4j https://bitbucket.org/b_c/jose4j/wiki/Home。 我尝试根据秘密生成密钥:

SecretKeySpec key = new SecretKeySpec(("secret").getBytes("UTF-8"), AlgorithmIdentifiers.HMAC_SHA512);

但它生成 40 位密钥,而使用 HMAC_SHA256 签名需要 512 位密钥。

  • 主要问题 - 如何使用 jose4j 使用 HMAC_SHA512 签署令牌?
  • 我解决上述问题的方法产生的问题 - 如何根据秘密字符串制作 512 位长的秘密密钥?

JWA/RFC 7518 第 3.2 节 https://www.rfc-editor.org/rfc/rfc7518#section-3.2表示与散列输出大小相同或更大的密钥必须与 JWS HMAC SHA-2 算法一起使用(即“HS256”为 256 位,“HS384”为 384 位,“HS512”为 512 位)。一般来说,遵循 IETF 和 NIST 的建议是个好主意。粗略地说,HMAC 的安全性来自于哈希输出的大小和密钥长度,以较小者为准。因此,使用“秘密”的字节作为密钥会得到一个只有 48 位长的密钥,并且实际上提供的安全性比该密钥要低得多,因为它是一个字典单词,无论您使用的 HMAC SHA-2 算法的强度如何。选择了。

默认情况下jose4j https://bitbucket.org/b_c/jose4j/wiki/Home强制执行 JWA/RFC 7518 规定的最小密钥大小。但是,正如 Hans 指出的那样,有一些方法可以告诉 jose4j 放宽密钥长度要求。这可以通过以下方式完成JwtConsumer通过致电.setRelaxVerificationKeyValidation() on JwtConsumerBuilder and on JsonWebSignature直接与.setDoKeyValidation(false)。下面是一个使用 HMAC SHA256 生成和使用 JWT 的快速示例,该示例显示了两者。

JwtClaims claims = new JwtClaims();
claims.setExpirationTimeMinutesInTheFuture(5);
claims.setSubject("foki");
claims.setIssuer("the issuer");
claims.setAudience("the audience");

String secret = "secret";
Key key = new HmacKey(secret.getBytes("UTF-8"));

JsonWebSignature jws = new JsonWebSignature();
jws.setPayload(claims.toJson());
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);
jws.setKey(key);
jws.setDoKeyValidation(false); // relaxes the key length requirement

String jwt = jws.getCompactSerialization();
System.out.println(jwt);

JwtConsumer jwtConsumer = new JwtConsumerBuilder()
        .setRequireExpirationTime()
        .setAllowedClockSkewInSeconds(30)
        .setRequireSubject()
        .setExpectedIssuer("the issuer")
        .setExpectedAudience("the audience")
        .setVerificationKey(key)
        .setRelaxVerificationKeyValidation() // relaxes key length requirement 
        .build();

JwtClaims processedClaims = jwtConsumer.processToClaims(jwt);
System.out.println(processedClaims);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用? 的相关文章

随机推荐