当前位置: 首页 > 知识库问答 >
问题:

如何使HMAC_SHA256密钥从秘密字符串与jose4j中的JWT一起使用?

宋原
2023-03-14

我想生产JWT,并与HMAC_SHA256签约。对于这个任务,我必须使用jose4j。我试图生成基于秘密的密钥:

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

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

  • 主要问题-如何使用jose4j与HMAC_SHA512签署令牌
  • 我解决上述问题的方法产生的问题-如何基于秘密字符串生成512位长的密钥

共有2个答案

葛海阳
2023-03-14

一种常见的方法是在将秘密用作签名密钥之前对其进行散列。

MessageDigest md = MessageDigest.getInstance("SHA-256");
String secret = "secret";
md.update(secret.getBytes("UTF-8"));
byte[] key = md.digest();

另一种方法是通过以下方式放宽对键长度的要求:

JwtConsumer jwtConsumer = new JwtConsumerBuilder()
     .setVerificationKey(new HmacKey(secret.getBytes())) 
     .setRelaxVerificationKeyValidation() // allow shorter HMAC keys when used w/ HSxxx algs 
     .build();
锺离昂然
2023-03-14

JWA/RFC 7518第3.2节规定,与哈希输出大小相同或更大的密钥必须与JWS HMAC SHA-2算法一起使用(即,256位表示“HS256”,384位表示“HS384”,

默认情况下,jose4j强制执行JWA/RFC 7518规定的最小密钥大小。然而,正如汉斯指出的,有一些方法可以告诉jose4j放松密钥长度要求。这可以通过调用Jwt消费者Jwt消费者构建器JsonWebSignature上直接调用. setDoKey验证(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);
 类似资料:
  • null 例如,轮转设定为7天。所以我在我的应用程序中编码每7天刷新一次...不好,因为很难精确计时。 另一种方法是,如果我的应用程序面临身份验证异常,只需刷新密码,建立一个新的连接,并重试应用程序逻辑。 行业标准是什么?

  • 我有一个使用Bosh部署的concourse环境。它配置有AWS机密管理器。管道机密模板的格式为 我在AWS秘密管理器(其他类型的秘密)中创建了一个秘密,其值如下。 我在团队中设置了一个总汇管道。

  • 我有C#中的OpenPGP 和< code>pgpid,如何使用Bouncy Castle库简单地加密一个字符串? 接收方公钥(MPI in base64):< code > BADelitpUqMZLn bryzr 5 rk 9j 3 eu prvfp 5 tpbooliwo 2 vqo/rci 8 vvt 2 tpzejarwhyz 465 niohyciia 9 vague P4 rsdzf

  • 使用AKV管理存储帐户:https://docs.microsoft.com/en-us/Azure/key-vault/key-vault-overview-storage-keys-powershell#manage-storage-account-keys 使用Azure Automation进行密钥循环:https://docs.microsoft.com/en-us/Azure/key-

  • 尝试将数据解密为用AES-128加密的字节数组,使用字符串密钥"keykeykeykey1" 代码: 给我BadPaddingExc0019。我错过了什么?

  • 我正在尝试将https://docs.microsoft.com/en-us/Azure/key-vault/tutorial-net-create-vault-azure-web-app中的示例代码转换为VB.net,并使用它访问我存储在Azure密钥库中的秘密。我在http://converter.telerik.com/使用了转换器。 转换后的代码出现一个错误:“委托'KeyVaultCli