当前位置: 首页 > 知识库问答 >
问题:

验证使用openssl生成的分离xml签名

皇甫乐
2023-03-14
public PublicKey pubTest(String path) throws Exception
 {
     FileInputStream fin = new FileInputStream(path);
     CertificateFactory f = CertificateFactory.getInstance("X.509");
     X509Certificate certificate = (X509Certificate)f.generateCertificate(fin);
     PublicKey pk = certificate.getPublicKey();
     System.out.println(pk);
     return pk;
 }
 public byte[] signature(String sigPath) throws Exception
 {
     FileInputStream sigfis = new FileInputStream(sigPath);
     byte[] sigToVerify = new byte[sigfis.available()]; 
     sigfis.read(sigToVerify);
     sigfis.close();
     System.out.println(sigToVerify.length);

     return sigToVerify ;
 }

 public boolean verification(PublicKey pubKey , String dataPath , byte[] sigToVerify ) throws Exception, NoSuchProviderException ,SignatureException
{

    Signature sig = Signature.getInstance("SHA1withRSA");
    sig.initVerify(pubKey);
    FileInputStream datafis = new FileInputStream(dataPath);
    BufferedInputStream bufin = new BufferedInputStream(datafis);
    byte[] buffer = new byte[1024];
    int len;
    while (bufin.available() != 0)
    {
        len = bufin.read(buffer);
      sig.update(buffer, 0, len);
    }
    System.out.println(buffer.length);
    bufin.close();
    boolean verifies = sig.verify(sigToVerify);
    System.out.println("signature verifies: " + verifies);
    return verifies ;
}

共有1个答案

宦飞
2023-03-14

现在很晚了,但如果有人遇到它:

openSSL smime-sign默认情况下生成“间接”分离签名,即不包含encapContentInfo中的数据但使用Signedattrs的签名。见https://www.ietf.org/RFC/RFC3369.txt 5.3至5.6;您需要将数据的哈希值与signedAttrs中的message-digest属性进行比较,然后根据signedAttrs验证签名(隐式标记恢复为basic)。

标准Java加密没有(目前?)做CMS/PKCS#7,但如果可以的话,BouncyCastle会做。考虑使用bouncycastle签名和验证签名的正确方法

 类似资料:
  • 是否可以验证带有p7s分离签名的文件?我正试图使用Openssl实现这一点,但我得到了一条关于Openssl的默认消息和 这是我的命令: 是否可以使用openssl进行文件验证和p7s签名? --编辑。。。 只是想让你知道。我有一个p7s文件和一个pdf文件。我想知道如何验证这一点。

  • 我想验证C中的签名,这是我在Java中签名的随机签名。 以下是我用于签名的Java代码: 现在我想用C验证签名,我需要C代码等于以下Java代码: 到目前为止,我所尝试的: 此方法返回0,但我确信随机是用正确的键签名的,并且该方法需要返回1...我想我的验证用的C代码有问题。也许你们中的一个知道如何做对。 --解决--

  • 我正在编写一些代码,试图对一些数据进行签名。在将openssl生成的私钥转换为Java密钥库之后,我将Java签名类与SHA256withRSA一起使用。我试图确认openssl中Java类返回的签名,但由于某些原因,我无法让openssl进行验证。我最终需要在iOS Swift 3中实现这个签名验证,但在找到库之前,我想尝试根据openssl标准检查Java签名。 例如,我从我们的登录服务器得到

  • 我想创建一个签名并使用openssl验证它。我想有我的签名的十六进制输出。 这是我的密码 我得到这个错误: 如果我在创建签名的过程中删除了-hex,它就可以工作了。

  • 我是不是漏掉了什么?这是构建自签名证书的正确方法吗?

  • 我正在用Java对一个二进制文件进行签名。我能够在Java代码中签名和验证,但是在openssl中使用生成的签名时,它无法验证到相同的二进制文件。步骤是:加载数据- 这应该相当于在openssl: openssl dgst-sha256-符号private.key-二进制target.bin 我验证了sha256与openssl生成的匹配。

  • 我尝试制作一个Perl-Script来验证SMIME消息"手动"。我真的试了很多,但没有用。 大多数情况下,验证会放置“签名长于密钥”或只是给出错误的返回。 如果我在控制台用OpenSSL做这件事,它就像一个魅力。 它生成并验证msg.txt 我把它改短了。 现在我尝试用非常简单的Perl来展示它。我简化了MIME处理,只使用msg.txt中的内联值。 我跳过了剩下的。它相当于msg.txt中的签

  • 我正在尝试使用加密来验证open-ssl签名,这是open-ssl部分: 现在在我的C代码中: 但是我总是收到验证失败的消息