为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 RSA512 算法创建签名的 JWT

如何使用 RSA512 算法创建签名的 JWT

不负相思意 2023-03-17 13:49:17
我试图创建 JWT(“JOT”)令牌以使我的 api 调用真实。每当我尝试使用 RSA512 签名创建令牌时,我都会收到一条错误消息java.lang.IllegalArgumentException:必须使用 RSA 私钥计算 RSA 签名。类型为 javax.crypto.spec.SecretKeySpec 的指定密钥不是 RSA 私钥。我正在使用以下代码: SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.RS512; long nowMillis = System.currentTimeMillis();  Date now = new Date(nowMillis); byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY); Key signingKey = new SecretKeySpec(apiKeySecretBytes,                 signatureAlgorithm.getJcaName());   JwtBuilder builder = Jwts.builder().claim("uuid",     id).setIssuedAt(now).setExpiration(new Date(600000))    .signWith(signatureAlgorithm, signingKey);注意:我的“SECRET_KEY”是一个字符串,是网上随机生成的私钥。我的问题是如何从使用 RSA 密钥大小编码为 4096 的字符串中获取密钥对象。4096 因为我使用的是 RSA512 加密,建议对 RSA512 使用 4096 密钥
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

最初我没有提供 Base64 编码的 RSAkey ,我将它再次编码为 base64 ,这就是我收到此错误的原因。


java.lang.IllegalArgumentException:必须使用 RSA 私钥计算 RSA 签名。类型为 javax.crypto.spec.SecretKeySpec 的指定密钥不是 RSA 私钥。


每当我提供 RSAKey base 64 编码或字节码私钥时,我都会回到错误之下


只能为 HMAC 签名指定 Base64 编码的密钥字节。如果使用 RSA 或椭圆曲线,请改用 signWith(SignatureAlgorithm, Key) 方法。


当我提供私钥的字符串/字节时,它一直在检查 HMAC 算法。请参阅 JWTBuilder 中的以下代码。


@Override

public JwtBuilder signWith(SignatureAlgorithm alg, byte[] secretKey) {

    Assert.notNull(alg, "SignatureAlgorithm cannot be null.");

    Assert.notEmpty(secretKey, "secret key byte array cannot be null or empty.");

    Assert.isTrue(alg.isHmac(), "Key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.");

    this.algorithm = alg;

    this.keyBytes = secretKey;

    return this;

}


@Override

public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) {

    Assert.hasText(base64EncodedSecretKey, "base64-encoded secret key cannot be null or empty.");

    Assert.isTrue(alg.isHmac(), "Base64-encoded key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.");

    byte[] bytes = TextCodec.BASE64.decode(base64EncodedSecretKey);

    return signWith(alg, bytes);

}


@Override

public JwtBuilder signWith(SignatureAlgorithm alg, Key key) {

    Assert.notNull(alg, "SignatureAlgorithm cannot be null.");

    Assert.notNull(key, "Key argument cannot be null.");

    this.algorithm = alg;

    this.key = key;

    return this;

}

提供 java.security.key 类型的私钥并且必须是 RSA 密钥总是最好的主意。我使用 P12 证书加载私钥。


查看完整回答
反对 回复 2023-03-17
  • 1 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信