【问题标题】:How to verify digital signature with a file in Java?如何使用 Java 中的文件验证数字签名?
【发布时间】:2018-04-28 09:19:33
【问题描述】:

我是密码学领域的初学者。我有 2 个文件 - 其中一个是数字签名(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 并使用作者的(来自外部的数据,字符串)验证姓氏和全名)。令人惊讶的是,我应该有一个文件,我也应该用它来验证签名。我知道有奇怪的哈希码逻辑(该文件是完整的并且符号与文件完全相关)。问题是如何从文件中检索这些数据并签名?为了接受或拒绝它,我究竟应该比较什么?我使用的库是 Bouncy Castle。

【问题讨论】:

    标签: java hash cryptography digital-signature asn.1


    【解决方案1】:

    我在我的项目中使用Demoiselle Framework 来解决这个问题。

    尤其是Signer Part

    也许这段代码也可以帮助到你

    例如:

    ```java

        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 作为您的 Provider,获取您的 SignPolicy 信息,验证证书链,获取数据生成器并构建您的属性表。 The way Demoiselle do.

    如果您想查看使用其签名者的示例: https://github.com/demoiselle/signer/blob/master/signer-examples/src/main/java/org/demoiselle/signer/signer/examples/Signer.java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2011-09-22
      • 2013-04-15
      • 2010-10-22
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多