2013-12-14 54 views
1

爲了使用Java實現加密,我使用的是JCE,它非常好玩。 我被告知選擇加密提供程序比使用默認加密提供程序更好。Java Crypto Api - 如何選擇密碼提供者

我需要爲對稱密鑰生成選擇提供者。使用此代碼(CBC模式下使用AES):

Key sharedKey = (KeyGenerator.getInstance("AES/CBC/PKCS5PADDING", PROVIDER1).generateKey(); 

和通過該代碼(ECB模式下使用RSA)使用非對稱文本加密:

Cipher rsaEncryptor = Cipher.getInstance("RSA/ECB/PKCS1Padding",PROVIDER2); 

我的問題是我應該如何選擇PROVIDER1和PROVIDER2?

例如,我看到「SunJCE」是一個有據可查的供應商,但我認爲它不是一個「足夠好」的理由來選擇它。

有人嗎?

+0

請注意,無論這些密鑰用於什麼,都需要'KeyGenerator'來生成AES密鑰。因此,不需要指定''CBC/PKCS5Padding'',只需'「AES」'就足夠了... –

回答

3

一般來說,你應該堅持默認的提供者,除非有令人信服的理由。硬編碼你的提供者有一個嚴重的缺點,就是你的代碼不允許你在不重寫你的代碼的情況下改變你的提供者。我直接選擇提供者的唯一原因是要確保滿足一些安全約束條件,而其他提供者則不會這樣做。

以下段落directly from the Oracle documentation

提醒:在JDK加密實現都是通過幾個不同的供應商分佈( 「太陽報」, 「SunJSSE」, 「了SunJCE」, 「SunRsaSign」)兩個歷史原因以及提供的服務類型。通用應用程序不應該向特定的提供者請求加密服務。那就是:

getInstance("...", "SunJCE"); // not recommended 
    vs. 
getInstance("...");   // recommended 

您仍然可以在允許通過給企業提供更高的優先級可以使用其他供應商(較低的優先級指標,1爲最高優先級)的java.security文件中的jre/lib/security內你的運行時的路徑。如果要使用getInstance("Algorithm", "Provider")指定提供者,則可以將提供者字符串配置爲可能是一個好主意(例如,使用屬性並使用myConfig.getProperty("Provider"))。

+0

非常感謝您的詳細解答,請您詳細說明不同提供商之間需要考慮的差異。 性能,安全性和內存使用方面有什麼不同嗎? – Wasafa1

+0

這一切都取決於。我經常使用PKCS#11提供程序以及FIPS或Common Criteria認證硬件令牌(例如智能卡)。如果正確應用,顯然更安全。對於任何提供商來說,內存使用通常是最小的(與現在可用的GB的可用性相比)。對於軟件提供商,性能比較應該可以在特定的配置上完成。安全措施非常棘手,但我不會依賴不執行RSA致盲的庫。如果不確定,請保留Oracle默認值(如果可用)。 –

+0

謝謝,我會繼續調查。 – Wasafa1