You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中RSA2048签名验证报错:签名长度不符需预处理吗?

解决RSA2048签名验证时的“Signature length not correct”错误

兄弟,这个错误完全不需要修改签名本身,问题出在你对签名的编码处理上!先给你理清楚来龙去脉:

RSA2048的签名长度是固定的256字节(2048位 ÷ 8 = 256),你报错里的384字节,大概率是把Base64编码后的签名字符串直接转成字节数组导致的——因为Base64编码会把二进制数据膨胀约1.33倍,你拿到的文本格式签名必须先解码成原始二进制,才能符合RSA2048的验证要求。

给你几个具体的解决步骤:

  • 第一步:先解码签名,再执行验证
    外部公司提供的签名几乎都是Base64(或Base64URL)编码后的字符串,你必须先把它解码成原始二进制字节数组,再传给Signature.verify()方法。如果直接把字符串按UTF-8转成字节数组,得到的就是编码后的长度(比如384),这肯定不符合RSA2048的签名长度要求。

  • 第二步:根据签名格式选择正确的解码器
    不同的编码格式对应不同的解码方式:

    • 标准Base64格式:用Base64.getDecoder().decode(signatureString)
    • Base64URL格式(常用于URL或JSON场景):用Base64.getUrlDecoder().decode(signatureString)
    • 如果是PEM格式的签名(开头有-----BEGIN SIGNATURE-----标记):先去掉首尾的标记行和所有换行符,再用Base64解码。
  • 修正你的代码示例
    假设你拿到的是标准Base64签名字符串,修改验证逻辑如下:

    import java.util.Base64;
    import static java.nio.charset.StandardCharsets.UTF_8;
    // ... 其他必要导入
    
    // 假设signatureStr是外部公司提供的签名字符串
    byte[] decodedSignature = Base64.getDecoder().decode(signatureStr);
    
    // 初始化Signature(注意算法要和对方完全一致,比如SHA256withRSA)
    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initVerify(publicKey);
    signature.update(yourData.getBytes(UTF_8));
    
    // 验证解码后的原始签名
    boolean isValid = signature.verify(decodedSignature);
    
  • 额外排查点
    要是解码后还是报错,再检查这两个关键项:

    1. 公钥是否正确:打印公钥信息确认是RSA2048:
      System.out.println("公钥算法:" + publicKey.getAlgorithm());
      System.out.println("公钥长度:" + ((RSAKey)publicKey).getModulus().bitLength());
      
      确保输出是RSA和2048。
    2. 签名算法是否匹配:对方用的哈希算法要和你初始化Signature时的一致,比如对方用SHA256withRSA,你就不能用SHA1withRSA。

内容的提问来源于stack exchange,提问作者Questioner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:16:41