在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傳遞。
問題是爲什麼在鹽和迭代僅在加密方法使用
被調用,當它可以內部完成初始化()方法?
有什麼區別?
我在提出這個問題,因爲由於上面的實現,當迭代計數增加時,encrypt()和decrypt()操作很慢。
在此先感謝。
因此,對於每次加密,它會使用不同的鹽,迭代計數和加密消息來派生新密鑰? – jaghan
除非您使用FixedSaltGenerator實現,否則它不會。 –
@DanielFernández固定鹽發生器的性能提升有多大? – kozla13