我正在使用code of this entry(目标BouncyCastle 1.54),但我传递的是一个1.7GB的文件,而不是传递一个小字符串的字节。我改变的唯一一条线是:
// CMSTypedData msg = new CMSProcessableByteArray(signature.sign()); wrong line
CMSTypedData msg = new CMSProcessableByteArray(text.getBytes());
有:
CMSTypedData msg = new CMSProcessableFile(new File("D:\\season4_mlp.rar"));
并且它有效:D它生成有效的分离签名。只要我使用原始字节,我就不需要Base64编码,因此不需要有问题的Sun导入。 但是我测量了签署我的大文件所花费的时间,它在15到22秒之间(JVM应该在运行之间进行一些优化)。
然后I used the code in this post,给出解决方案
Peter Dettman,并声明gen
对象如下(从CMSSignedDataGenerator
到CMSSignedDataStreamGenerator
的更改除外,它是来自this的复制/粘贴):
CMSSignedDataStreamGenerator gen = new CMSSignedDataStreamGenerator();
gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(sha1Signer, cert));
gen.addCertificates(certs);
并在行
中传递false
OutputStream sigOut = gen.open(bOut, false);
现在签署我的文件需要19到21秒,签名也是有效的。
一般情况下,我测试了两个类CMSSignedDataGenerator
和CMSSignedDataStreamGenerator
,Netbeans 8.0.2,目标是Java 8,在i3 330GHz英特尔Win7 x64 SP1机器和4GB内存,其他几个应用程序打开,最终得到了类似的结果。
我想知道是否有一种优化/更快的方式来用BC签署大文件。对我来说,处理1.7GB文件20秒听起来不错,但在生产环境中,最好找到更快的解决方案。
Ram消费不是问题,我检查了Netbeans的消耗量,它从700 Mb增加到近800 Mb。 Firefox现在正在吃更多的ram。我很关心签约速度。答案 0 :(得分:0)
根据user3707125评论,建议from this web和从互联网上其他地方复制的代码,在测试其他代码和java类之后,我推出了这段代码来计算大文件的哈希值:
byte[] buf = new byte[8192];
MessageDigest sha = MessageDigest.getInstance("SHA1");
FileInputStream inp = new FileInputStream(new File("D:\\season4_mlp.rar"));
int n;
while((n = inp.read(buf)) > 0)
sha.update(buf, 0, n);
byte hash[] = sha.digest();
处理我的1.7 GB文件大约需要20到22秒。
似乎BC在内部做了几次优化以获得接近我的时间(我没有仔细阅读它的源代码)。所以,据我所知,这是我能得到的最佳表现。