我必须使用SHA-256算法和密钥(例如“ blablablamysecretkey”)来获得JWT。

尽管进行了SO检查,但我仍然不知道如何执行几个库及其文档。

如果我使用此库https://github.com/jwtk/jjwt(最常用的库之一),则为代码示例:

Key key = MacProvider.generateKey();
String s = Jwts.builder().setSubject("stringtoencode").signWith(SignatureAlgorithm.HS512, key).compact();


由于我必须使用SHA-256算法,因此我应该使用:

Key key = MacProvider.generateKey();
String s = Jwts.builder().setSubject("stringtoencode").signWith(SignatureAlgorithm.HS256, key).compact();


我的问题是该示例(以及我所见过的所有示例)都使用Key key = MacProvider.generateKey();,如果我没记错的话,这会生成一个通用密钥。实际上,这就是文档所说的:

// We need a signing key, so we'll create one just for this example. Usually
// the key would be read from your application configuration instead.


所以我的问题是如何将我的秘密密钥(字符串)转换为Key类?

最佳答案

MacProvider.generateKey()生成一个随机密钥,它比使用密码短语安全。密钥需要随机选择。如果您想知道必须如何生成hmac密钥,请阅读此文章。


  //我们需要一个签名密钥,因此我们仅为该示例创建一个签名密钥。通常
  //该密钥将从您的应用程序配置中读取。


突出显示的文本意味着您必须在服务器中保留密钥,以便在客户端发送令牌时验证JWT签名。 HMAC密钥是对称的,该密钥用于签名和验证

如果要从密码Key生成String,请使用

byte hmacKey[] = passphrase.getBytes(StandardCharsets.UTF8);
Key key = new SecretKeySpec(hmacKey,signatureAlgorithm.getJcaName());

10-04 19:08