如何用Java文件验证数字签名?

如何用Java文件验证数字签名?,java,hash,cryptography,digital-signature,asn.1,Java,Hash,Cryptography,Digital Signature,Asn.1,我是密码学领域的初学者。我有两个文件-其中一个是数字签名(p7s,signedData)和我应该验证签名的文件。问题是如何使用Java实现这一点?首先我想我可以这样做 String rawString = ASN1ObjectIdentifier.fromByteArray(bytesArray).toString(); String rawStringForSurname = rawString.substring(rawString.indexOf("2.5.4.4,") + 9, raw

我是密码学领域的初学者。我有两个文件-其中一个是数字签名(p7s,signedData)和我应该验证签名的文件。问题是如何使用Java实现这一点?首先我想我可以这样做

String rawString = ASN1ObjectIdentifier.fromByteArray(bytesArray).toString();

String rawStringForSurname = rawString.substring(rawString.indexOf("2.5.4.4,") + 9, rawString.length());
String signSurname = rawStringForSurname.substring(0, rawStringForSurname.indexOf("]"));


String rawStringForGivenName = rawString.substring(rawString.indexOf("2.5.4.42,") + 10, rawString.length());
String signGivenName = rawStringForGivenName.substring(0, rawStringForGivenName.indexOf("]"));
这显然很糟糕。我的输入数据只打算有一个文件(p7s文件,稍后解码为ASN.1,并用作者的(外部数据,字符串)验证姓氏和全名)。令人惊讶的是,事实证明,我应该有一个文件,我应该验证签名以及。我知道有奇怪的hashcode逻辑(该文件是完整的,符号与该文件完全相关)。问题是如何从文件中检索此数据并进行签名?为了接受或拒绝它,我到底应该比较什么?我使用的库是Bouncy Castle。

我在项目中使用它来解决这个问题。 尤其是

也许这部分代码也能帮助你 例如:

```爪哇

    package stackoverflow.my.pack;

    import java.nio.file.Path;
    import java.security.PrivateKey;
    import java.security.cert.X509Certificate;
    import java.util.Arrays;

    import org.bouncycastle.asn1.x509.Certificate;
    import org.demoiselle.signer.policy.engine.factory.PolicyFactory.Policies;
    import org.demoiselle.signer.policy.impl.cades.factory.PKCS7Factory;
    import org.demoiselle.signer.policy.impl.cades.pkcs7.PKCS7Signer;

    public class MySigner {
        private static PKCS7Signer signerLoader() {
            PKCS7Signer signer = PKCS7Factory.getInstance().factoryDefault();
            PrivateKey pk = MyReader.getPrivateKey();// Create some method to get your PK
            signer.setPrivateKey(pk);

            X509Certificate certificate = MyReader.getMyPublicKey();// Create some method to get your Pub
            signer.setCertificates((Certificate[]) Arrays.asList(certificate).toArray());

            if (is2048(privateKey)) {
                signer.setSignaturePolicy(Policies.AD_RB_CADES_2_2);
            } else {
                signer.setSignaturePolicy(Policies.AD_RB_CADES_1_1);
            }
            return signer;
        }

        public static byte[] myMethodToSign(byte[] fileToBeSigned) throws MySignerException {
            PKCS7Signer signer = signerLoader();
            return signer.doHashSign(fileToBeSigned);
        }
    }
```

Demoiselle也使用BouncyCastle,你可以看到他们的符号方法来帮助你。 您必须加载您的PK,添加BouncyCastle作为您的提供者,获取您的SignPolicy信息,验证证书链,获取数据生成器并构建属性表。

如果您想查看使用其签名者的示例: