用keytool 和jarsigner 给jar做了数字签名,并生成了证书和密钥库。现在想用java程序验证一下签名?我现在是这么做的:  1 从证书里读取公钥 进行 signature的initverify
  2 从证书里读取签名部分 用的证书的getSignature()这个方法
  3 读取已经签名的jar,进行signature的update
  4 然后调用signuature 的 verify方法进行验证  现在验证的结果总是false?不知道是什么原因了,各位在处理这个问题的时候都是怎么做的?

解决方案 »

  1.   

    以下为验证的代码package test;import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.PublicKey;
    import java.security.Signature;
    import java.security.SignatureException;
    import java.security.cert.CertificateException;
    import java.security.cert.CertificateFactory;
    import java.security.cert.X509Certificate;public class NewCert { public static void main(String[] args) {
    try {
    // 公钥
    CertificateFactory certificatefactory = null;
    certificatefactory = CertificateFactory.getInstance("X.509");
    FileInputStream fin = new FileInputStream("D://test.cer");
    X509Certificate certificate = (X509Certificate) certificatefactory
    .generateCertificate(fin);
    fin.close(); Signature sign = Signature.getInstance("SHA1withDSA");
    PublicKey pub = certificate.getPublicKey();
    sign.initVerify(pub); // 签名
    byte[] bytss = certificate.getSignature(); // 已签名的文件 FileInputStream fis = null;
    try {
    fis = new FileInputStream("D://test.jar");
    } catch (FileNotFoundException e1) {
    e1.printStackTrace();
    }
    BufferedInputStream bufin = new BufferedInputStream(fis); byte[] buffer = new byte[1024];
    int len;
    while (bufin.available() != 0) {
    len = bufin.read(buffer);
    sign.update(buffer, 0, len);
    } bufin.close(); boolean verifies = sign.verify(bytss);
    System.out.println("verified " + verifies);
    if (verifies) {
    System.out.println("Verify is done!");
    } else {
    System.out.println("verify is not successful");
    }
    } catch (IOException e1) {
    e1.printStackTrace();
    } catch (CertificateException e) {
    e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    } catch (InvalidKeyException e) {
    e.printStackTrace();
    } catch (SignatureException e) {
    e.printStackTrace();
    } }
    }
      

  2.   

    http://stackoverflow.com/questions/1374170/how-to-verify-a-jar-signed-with-jarsigner-programmatically
    http://stackoverflow.com/questions/5587656/verifying-jar-signature
    http://stackoverflow.com/questions/4970016/how-to-verify-signature-on-self-signed-jar