我使用的code of this entry(針對BouncyCastle 1.54),但不是傳遞一個小字符串的字節,我通過它一個1.7GB的文件。唯一的一條線,我改變了:優化的方式來使用BouncyCastle簽署大文件
// 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,與由 彼得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在i3 330GHz intel Win7 x64 SP1機器和4GB ram上打開Java 8,其他幾個應用程序打開,最後得到類似的結果。
我想知道是否有一個優化/更快的方式來簽署大型文件與BC。對我而言,處理1.7GB文件的時間爲20秒聽起來不錯,但在生產環境中,我們希望找到更快的解決方案。
拉姆消耗量不是問題,我檢查了Netbeans消耗量,它從700 Mb降到了將近800 Mb。 Firefox目前正在吃更多的ram。我很擔心簽名速度。
您是否測試過可以從磁盤讀取文件的速度有多快?我相信大部分時間都花在IO上。此外,JVM無法在運行之間進行優化,因此很可能您的OS/HDD只緩存文件的一部分,從而提高性能。 – user3707125