2016-03-03 65 views
0

我使用的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對象如下(除了從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在i3 330GHz intel Win7 x64 SP1機器和4GB ram上打開Java 8,其他幾個應用程序打開,最後得到類似的結果。

我想知道是否有一個優化/更快的方式來簽署大型文件與BC。對我而言,處理1.7GB文件的時間爲20秒聽起來不錯,但在生產環境中,我們希望找到更快的解決方案。

拉姆消耗量不是問題,我檢查了Netbeans消耗量,它從700 Mb降到了將近800 Mb。 Firefox目前正在吃更多的ram。我很擔心簽名速度。

+0

您是否測試過可以從磁盤讀取文件的速度有多快?我相信大部分時間都花在IO上。此外,JVM無法在運行之間進行優化,因此很可能您的OS/HDD只緩存文件的一部分,從而提高性能。 – user3707125

回答

0

繼user3707125評論,複製從互聯網上的其他地方,並測試其他代碼和Java類後,建議from this web和代碼,我拿出這個代碼來計算一個大文件的哈希:

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(); 

大約需要20到22秒來處理我的1.7 GB文件。

BC似乎在內部進行了幾次優化以獲得接近我的時間(我沒有細讀它的源代碼)。所以,據我所知,這是我能得到的最好的表現。