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格式:用
修正你的代码示例
假设你拿到的是标准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);额外排查点
要是解码后还是报错,再检查这两个关键项:- 公钥是否正确:打印公钥信息确认是RSA2048:
确保输出是System.out.println("公钥算法:" + publicKey.getAlgorithm()); System.out.println("公钥长度:" + ((RSAKey)publicKey).getModulus().bitLength());RSA和2048。 - 签名算法是否匹配:对方用的哈希算法要和你初始化Signature时的一致,比如对方用SHA256withRSA,你就不能用SHA1withRSA。
- 公钥是否正确:打印公钥信息确认是RSA2048:
内容的提问来源于stack exchange,提问作者Questioner
相关产品推荐
相关产品推荐

