signature.verify()始终返回False?

时间:2012-08-22 03:07:03

标签: java rsa signature

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

  1. signature.verify() Always returns False
  2. Signature.verify() is always returning false
  3. 两个人都说答案不起作用所以请不要把这个问题视为DUPLICATE

    这是我的代码。

    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){}
        }
    }
    

1 个答案:

答案 0 :(得分:1)

在我知道ReadXMLFile.getString不是正在测试完整性的数据而是编码签名本身之前,解释如下。有关决议,请参阅our discussion


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

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

来自specification for Signature.update

  

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

然后,从Signature.verify

  

验证传入的签名。

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

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