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

Posted

技术标签:

【中文标题】在 Java 中创建 JWT,在 Node 中验证很热门?【英文标题】:Creating JWT in Java, hot to verifyi in Node? 【发布时间】:2016-03-27 12:22:41 【问题描述】:

如何使用 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值不正确,仅作为示例提供。

【问题讨论】:

如何验证,糟糕的屏幕分辨率... 您的意思是要求njwtjsonwebtoken 吗? 另外,请提供 jjwt 生成的实际令牌 - 这将有助于我们调试 :) 你能看看下面的答案是否适合你吗? 【参考方案1】:

使用 JJWT 时,您正在对字符串 something 进行 base64 解码,但使用 nJwt 时您没有这样做。

String 的字节和 Base64 解码相同 String 产生的字节是不同的字节数组。因此,您的两个代码示例实际上使用了不同的键。

编辑:

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

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

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

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

HTH!

【讨论】:

以上是关于在 Java 中创建 JWT,在 Node 中验证很热门?的主要内容,如果未能解决你的问题,请参考以下文章

如何解码 Java 生成的 Node.js 中的 jwt 令牌?

如何在 Symfony 5 中创建 JWT 令牌?

如何在Java 中创建和验证JWT

在 java 中创建带有标头、有效负载和签名的 JWT

在 node.js 中生成的 JWT(JSON Web Token) 未在 java 中验证

如何在没有用户名/密码的nodejs中创建JWT用户/访问令牌?