我必须使用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());