java - RSA 签名异常 : Signature length not correct

标签 java security encryption rsa digital-signature

我在签署 rsa 签名时遇到问题。我有一个用私钥加密的签名。但是,我在尝试使用公钥验证它时遇到问题。我得到以下异常:

java.security.SignatureException: Signature length not correct: got 336 but was expecting 128
    at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:189)
    at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
    at java.security.Signature.verify(Signature.java:652)
    at XmlReader.main(XmlReader.java:65)

我已经通过以下方式取回了我的签名和公钥:

    BigInteger modulus = new BigInteger(Base64.getDecoder().decode(publicKeyString));
    BigInteger exponent = new BigInteger(Base64.getDecoder().decode("AQAB"));

    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PublicKey pubKey = keyFactory.generatePublic(keySpec);

    byte[] sigToVerify = Base64.getDecoder().decode(signatureString);
    Signature sig = Signature.getInstance("MD5WithRSA");
    sig.initVerify(pubKey);
    boolean verifies = sig.verify(sigToVerify);

应用程序在最后一行失败。关于这个异常是在哪里引起的有什么想法吗?

更新:

新增签名验证数据:

        String data = "...." //hidden since sensitive data
        byte[] dataBytes = Base64.getEncoder().encode(data.getBytes());
        dataBytes = Base64.getDecoder().decode(dataBytes);

最佳答案

在调用 sig.verify(sigToVerify) 之前你应该调用

sig.update(data);

传递您正在验证签名的数据。

并确保在你的参数中调用 verify 你只有签名字节。

关于java - RSA 签名异常 : Signature length not correct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46225417/

相关文章:

encryption - 在键值存储中查找加密 key

java - Web 服务中每个用户的全局变量

java - 哪里可以下载适用于 Windows 的 jdk 1.4.2

main函数返回后java进程仍然存在

Java:序列化/反序列化到/从 XML 而不是二进制

javascript - 鉴于 "social sharing"徽章 ("Like"按钮等的流行,您如何降低与第三方 Javascript 相关的风险?

database - IV 对静态数据的认证加密(GCM 模式)的关注

c - 函数 strcpy 总是危险的吗?

node.js - 如何在 Strapi 中安全地设置数据库密码?

javascript - 尝试通过 Steam 身份验证 : stumped with RSA ecnryption (js to python)