【问题标题】:CMSSignedDataStreamGenerator hash does not matchCMSSignedDataStreamGenerator 哈希不匹配
【发布时间】:2010-02-08 18:07:53
【问题描述】:

我正在编写一个使用BouncyCastle 对数据进行签名和封装的应用程序。

我需要对大文件进行签名,因此我选择使用CMSSignedDataStreamGenerator,而不是使用CMSSignedDataGenerator(对小文件非常有效)。正在生成签名文件,但 SHA1 哈希与原始文件不匹配。你能帮帮我吗?

代码如下:

try {

         int buff = 16384;
         byte[] buffer = new byte[buff];
         int unitsize = 0;
         long read = 0;
         long offset = file.length();
         FileInputStream is = new FileInputStream(file);
         FileOutputStream bOut = new FileOutputStream("teste.p7s");
         Certificate cert = keyStore.getCertificate(alias);
         PrivateKey key = (PrivateKey) keyStore.getKey(alias, null);
         Certificate[] chain = keyStore.getCertificateChain(alias);
         CertStore certStore = CertStore.getInstance("Collection",new CollectionCertStoreParameters(Arrays.asList(chain)));
         CMSSignedDataStreamGenerator gen = new CMSSignedDataStreamGenerator();
         gen.addSigner(key, (X509Certificate) cert, CMSSignedDataGenerator.DIGEST_SHA1, "SunPKCS11-iKey2032");
         gen.addCertificatesAndCRLs(certStore);
         OutputStream sigOut = gen.open(bOut,true);

         while (read < offset) {
             unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read));
             is.read(buffer, 0, unitsize);
             sigOut.write(buffer);
             read += unitsize;
         }
         sigOut.close();
         bOut.close();
         is.close();

我不知道我做错了什么。

【问题讨论】:

  • 将缓冲区设置为 1 似乎有效。我认为它正在处理最后一次缓冲区迭代中的 0 或空值。有没有其他办法解决?

标签: java cryptography stream bouncycastle


【解决方案1】:

我同意 Rasmus Faber 的观点,读/写循环很狡猾。

替换这个:

while (read < offset) {
    unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read));
    is.read(buffer, 0, unitsize);
    sigOut.write(buffer);
    read += unitsize;
}

与:

org.bouncycastle.util.io.Streams.pipeAll(is, sigOut);

【讨论】:

    【解决方案2】:

    一个可能的问题是这条线

     is.read(buffer, 0, unitsize);
    

    FileInputStream.read 只能保证在 1 和 unitsize 字节之间读取。

    试着写

    int actuallyRead = is.read(buffer, 0, unitsize);
    sigOut.write(buffer, 0, actuallyRead);
    read += actuallyRead;
    

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2013-08-20
      相关资源
      最近更新 更多