fok*_*oki 9 java encryption jwt jose4j
我想生产JWT并用HMAC_SHA256签名.对于那个任务,我必须使用jose4j.我试图基于秘密生成密钥:
SecretKeySpec key = new SecretKeySpec(("secret").getBytes("UTF-8"), AlgorithmIdentifiers.HMAC_SHA512);
Run Code Online (Sandbox Code Playgroud)
但是它会生成40位密钥,而使用HMAC_SHA256签名需要512位密钥.
Bri*_*ell 14
JWA/RFC 7518的第3.2节说,与散列输出相同或更大的密钥必须与JWS HMAC SHA-2算法一起使用(即,"HS256",384bits /"HS384"和512的256位)比特/ "HS512").遵循IETF和NIST的建议通常是个好主意.粗略地说,HMAC的安全性来自散列输出的大小和密钥长度,以较小者为准.因此,使用"secret"字节作为密钥为您提供了一个只有48位长的密钥,实际上,它提供的安全性远远低于它,因为它是一个字典单词,无论HMAC SHA-2算法的强度如何选择.
默认情况下,jose4j强制执行JWA/RFC 7518规定的最小密钥大小.但是,正如Hans指出的那样,有一些方法可以告诉jose4j放宽密钥长度要求.这可以JwtConsumer通过直接调用 .setRelaxVerificationKeyValidation()on JwtConsumerBuilder和on 来完成.下面是一个使用HMAC SHA256生成和使用JWT的快速示例.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);
Run Code Online (Sandbox Code Playgroud)
一种常见的方法是在将秘密用作签名密钥之前对其进行散列.
MessageDigest md = MessageDigest.getInstance("SHA-256");
String secret = "secret";
md.update(secret.getBytes("UTF-8"));
byte[] key = md.digest();
Run Code Online (Sandbox Code Playgroud)
另一种方法是放宽对密钥长度的要求,例如:
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setVerificationKey(new HmacKey(secret.getBytes()))
.setRelaxVerificationKeyValidation() // allow shorter HMAC keys when used w/ HSxxx algs
.build();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9420 次 |
| 最近记录: |