【问题标题】:RSA SignatureException: Signature length not correctRSA SignatureException:签名长度不正确
【发布时间】:2018-02-23 19:27:15
【问题描述】:

我在签署 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);

【问题讨论】:

  • 签名的内容在哪里?
  • MD5 对于签名生成显然是不安全的。根据输入,它仍然可能具有 some 值,但我不会打赌。 1024 位 RSA 密钥现在也太小了。

标签: java security encryption rsa digital-signature


【解决方案1】:

在致电sig.verify(sigToVerify) 之前,您应该致电

sig.update(data);

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

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

【讨论】:

  • 我已经添加了要验证的字符串的数据,但是,它似乎并没有解决问题
【解决方案2】:

好吧,签名大小显然不正确。这意味着至少签名格式不正确; RSA 签名本身始终是模数的大小(以字节为单位)(与密钥大小相同,在您的情况下为 1024 位短密钥)。

algrid is right 通常你必须先更新签名。因此,签名的输入以已签名的数据为前缀是合乎逻辑的。在这种情况下,最后 128 个字节可能是签名,之前的字节是数据。

签名也可能不是“原始”签名而是格式化签名,例如使用 PKCS#7 / CMS 语法或 PGP 语法。在这种情况下,您将需要一个库来对其进行解码。

请注意,如果没有已签名的数据,或者至少是数据的哈希值,您将无法验证签名。在这种情况下,您只能检查签名的正确性(通过验证在 RSA 模幂运算之前执行的填充,以防我们需要详细说明)。

【讨论】:

  • 没有签名的格式,这就是全部。
  • 请注意,一些(大多数?)标准确实有意在签名之前对数据(如果存在的话)进行排序,但 XMLDSig 并不要求这样做。当然,OP 对“Xml”的引用并不一定意味着他们正在专门实施 XMLDSig(或者如果是,那么正确)
  • 我已经添加了要更新的数据,尽管它似乎仍然给了我相同的签名长度异常
  • 您至少可以发布签名的值。
猜你喜欢
  • 2017-05-08
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多