【问题标题】:Creating JWT in Java, hot to verifyi in Node?在 Java 中创建 JWT,在 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 生成的实际令牌 - 这将有助于我们调试 :)
  • 你能看看下面的答案是否适合你吗?

标签: java node.js jwt


【解决方案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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多