JWA / RFC 7518的第3.2节规定,与哈希输出相同或更大的密钥必须与JWS HMAC SHA-2算法一起使用(即,“HS256”的256位,384位/“HS384”和512位/“HS512”)。遵循IETF和NIST的建议通常是一个好主意。粗略地说,HMAC的安全性来自哈希输出的大小和密钥长度,以较小者为准。因此,使用“secret”的字节作为密钥可以为您提供一个只有48位长的密钥,并且在实践中,提供的安全性甚至要低得多,因为它是一个字典单词,无论您选择的HMAC SHA-2算法的强度如何。
默认情况下,jose4j 强制执行 JWA/RFC 7518 规定的最小密钥大小。但是,正如Hans所指出的,有一些方法可以告诉jose4j放宽密钥长度要求。这可以通过直接调用和打开来完成。下面是一个使用 HMAC SHA256 生成和使用 JWT 的快速示例,其中显示了两者。JwtConsumer
.setRelaxVerificationKeyValidation()
JwtConsumerBuilder
JsonWebSignature
.setDoKeyValidation(false)
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);