1

我发现了 2 个类似的问题,并尝试运行作为解决方案给出的代码,因为这些答案对我来说不起作用,所以用代码片段提出问题。

  1. signature.verify() 总是返回 False
  2. Signature.verify() 总是返回 false

两者都说答案不起作用,所以请不要将此问题视为重复

这是我的代码。

import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.io.FileInputStream;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import xmlread.ReadXMLFile;


public class CertificateTest {


    public static void main(String[] sdd)  {

        try{
        FileInputStream fin = new FileInputStream("pub.arm");
        CertificateFactory f = CertificateFactory.getInstance("X.509");
        X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
        PublicKey pk = certificate.getPublicKey();
        byte[] sign = "Qn/rlJRdZAdlPpu1UmmjE+rup8rv8d6XlS9MngAorzYDXefw0vWEP4eHil3YHoA1JUkoQQOgmw0w0QZFmrQbS33sa2t76iuqXI7EtnAPU798K+hEXP88tsYDWJNJFo9DdhkGltP5dQ02DN030Q1w58aTF+yZFfY1KVOPx2bIoL8=".getBytes();

        Signature sig = Signature.getInstance("SHA1withRSA");
        sig.initVerify(pk);
        sig.update(Base64.decode(ReadXMLFile.getString().getBytes()));

        boolean verifies = sig.verify(Base64.decode(ReadXMLFile.getString().getBytes()));

        System.out.println("signature verifies: " + verifies);

        }catch(Exception ex){}
    }
}
4

1 回答 1

1

在我知道ReadXMLFile.getString不是正在测试其完整性的数据而是编码签名本身之前,下面是解释。请参阅我们的讨论以获取解决方案!


您的代码是错误的——您正在尝试将 base64 解码的 RSA 加密 SHA1 摘要与ReadXMLFile.getString()自身进行比较。

final byte[] data = Base64.decode(ReadXMLFile.getString().getBytes());
sig.update(data);
boolean verifies = sig.verify(data);

规范中Signature.update

使用指定的字节数组更新要签名或验证的数据。

然后,从Signature.verify

验证传入的签名。

现在,您实际上并没有将签名数据传递到verify! 你的意思是sig.verify(Base64.decode(sign))代替吗?

如果您需要进一步的证明,请发布pub.arm,我可以演示有效的正确代码:-)

于 2012-08-22T03:16:02.153 回答