2014-03-13 68 views
2

在org.jasypt.encryption.pbe.StandardPBEByteEncryptor中,當我比較其他幾個密鑰派生功能時,密鑰派生看起來不同。jasypt PBKDF2實現

的initialize()方法具有下述代碼用於生成祕密密鑰:

PBEKeySpec pbeKeySpec = new PBEKeySpec(this.password.toCharArray()); 
SecretKeyFactory factory = SecretKeyFactory.getInstance(this.algorithm);    
this.key = factory.generateSecret(pbeKeySpec); 

不具有鹽和迭代計數送入PBEKeySpec。

但encrypt()方法具有下述的代碼:

PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, this.keyObtentionIterations); 
byte[] encyptedMessage = null; 
synchronized (this.encryptCipher) { 
this.encryptCipher.init(
Cipher.ENCRYPT_MODE, this.key, parameterSpec); 
encyptedMessage = this.encryptCipher.doFinal(message); 
} 

其具有鹽和迭代計數爲PBEParameterSpec通過。

根據PBKDF2,使用密碼,salt和迭代計數生成密鑰。

在上面的代碼中,首先在initialize()方法中生成密鑰,salt和iteration count在encrypt()方法中作爲PBEParameterSpec傳遞。

問題是爲什麼在鹽和迭代僅在加密方法使用

  1. 被調用,當它可以內部完成初始化()方法?

  2. 有什麼區別?

我在提出這個問題,因爲由於上面的實現,當迭代計數增加時,encrypt()和decrypt()操作很慢。

在此先感謝。

回答

1

對於每個加密操作應用salt,因爲每個加密的消息都使用不同的salt。

initialize()方法只執行一次,所有執行(即加密密鑰)的信息將爲。而encrypt()方法必須處理加密參數 - 對每個加密操作不同(鹽)的引用計數和salt--。因此

改善這些encrypt()decrypt()操作的性能的唯一方法是避免以產生用於每個消息不同的鹽被加密,這意味着具有固定鹽發生器。 Jasypt 1.9.2包含一項改進,可以檢測是否正在使用這種鹽生成策略,並且在這種情況下避免每次加密操作都調用Cipher#init(...)。請參閱更改日誌以獲取更多信息:http://www.jasypt.org/changelogs/jasypt/ChangeLog.txt

免責聲明,根據StackOverflow規則:我是jasypt的作者。

+0

因此,對於每次加密,它會使用不同的鹽,迭代計數和加密消息來派生新密鑰? – jaghan

+0

除非您使用FixedSaltGenerator實現,否則它不會。 –

+0

@DanielFernández固定鹽發生器的性能提升有多大? – kozla13