使用BouncyCastle

时间:2016-03-03 23:08:34

标签: java performance netbeans bouncycastle

我正在使用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对象如下(从CMSSignedDataGeneratorCMSSignedDataStreamGenerator的更改除外,它是来自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秒,签名也是有效的。

一般情况下,我测试了两个类CMSSignedDataGeneratorCMSSignedDataStreamGenerator,Netbeans 8.0.2,目标是Java 8,在i3 330GHz英特尔Win7 x64 SP1机器和4GB内存,其他几个应用程序打开,最终得到了类似的结果。

我想知道是否有一种优化/更快的方式来用BC签署大文件。对我来说,处理1.7GB文件20秒听起来不错,但在生产环境中,最好找到更快的解决方案。

Ram消费不是问题,我检查了Netbeans的消耗量,它从700 Mb增加到近800 Mb。 Firefox现在正在吃更多的ram。我很关心签约速度。

1 个答案:

答案 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在内部做了几次优化以获得接近我的时间(我没有仔细阅读它的源代码)。所以,据我所知,这是我能得到的最佳表现。