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

在Java中创建JWT,热到在Node中验证?,java,node.js,jwt,Java,Node.js,Jwt,如何使用Node.js验证使用JJWT()在Java中创建的JWT?如果我们像下面那样创建JWT并打印出值: byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("something"); Key key = new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS512.getJcaName()); JwtBuilder builder = Jwts.buil

如何使用Node.js验证使用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);

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

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

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

编辑:

此外,为了确保密钥完整性保证,您应该确保在使用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();

如何验证,糟糕的屏幕分辨率…您的意思是要求
njwt
jsonwebtoken
?另外,请提供jjwt正在生产的实际令牌-这将帮助我们调试:)您能检查下面的答案吗?