在 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值不正确,仅作为示例提供。
【问题讨论】:
如何验证,糟糕的屏幕分辨率... 您的意思是要求njwt
或jsonwebtoken
吗?
另外,请提供 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 令牌?