gpt4 book ai didi

java - 在 Java 中创建 JWT,在 Node 中验证很热?

转载 作者:行者123 更新时间:2023-12-01 10:41:22 24 4
gpt4 key购买 nike

如何使用 Node.js 验证使用 JJWT ( https://github.com/jwtk/jjwt ) 在 Java 中创建的 JWT?如果我们像下面一样创建 JWT 并打印出值:

byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("something");
Key key = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS512.getJcaName());

JwtBuilder builder = Jwts.builder()
.setSubject(subject)
.signWith(SignatureAlgorithm.HS512, key);

System.put.println(builder.compact());

尝试解码 Node.js 中打印出的字符串会导致无效签名错误:

var nJwt = require('jsonwebtoken');

var token = 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJKb2UifQ.dqJqRrJ1zDlNq79RAJqhbqme23Fq_Fh9M4MufE5AT8A7-c2yo3OgG71RMSsUxloceG0WaYwhz3WIprcdZsYY_Q',
secretKey = 'something';

var verifiedJwt = nJwt.verify(token,secretKey);

console.log(verifiedJwt);

上面示例中的 token 值不正确,仅作为示例提供。

最佳答案

使用 JJWT 时,您正在对字符串 something 进行 Base64 解码,但使用 nJwt 时则不会这样做。

字符串的字节和同一字符串通过 Base64 解码得到的字节是不同的字节数组。因此,您的两个代码示例实际上使用了不同的 key 。

编辑:

此外,为了确保 key 完整性,您应该确保使用 HMAC-SHA 算法时的 key 等于或大于哈希输出长度。

对于 SHA-256,输出长度为 256 位,SHA-384 为 384,SHA-512 为 512。这意味着最小 key 长度分别为 32 字节(32 个 ASCII 字符)、48 字节和 64 字节。不建议使用某物作为 HMAC-SHA-512 的 key (9 字节)。

这就是 JJWT 提供便捷 key 生成器以确保最佳实践的原因:

byte[] hmacSha512Key = MacProvider.generateKey().getEncoded();
byte[] hmacSha384Key = MacProvider.generateKey(SignatureAlgorithm.HS384).getEncoded();
byte[] hmacSha256Key = MacProvider.generateKey(SignatureAlgorithm.HS256).getEncoded();

呵呵!

关于java - 在 Java 中创建 JWT,在 Node 中验证很热?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34395481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com