在 org.jasypt.encryption.pbe.StandardPBEByteEncryptor 中,当我比较其他几个密钥派生功能时,密钥派生看起来有所不同。
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,密钥是使用密码、盐和迭代计数生成的。
在上面的代码中,首先在 initialize() 方法中生成 key,然后在 encrypt() 方法中将迭代计数作为 PBEParameterSpec 传递。
问题是
为什么盐和迭代仅在调用 encrypt 方法期间使用,而它可以在 initialize() 方法中完成?
有什么区别?
我提出这个问题是因为,由于上述实现,当迭代次数增加时,encrypt() 和 decrypt() 操作很慢。
提前致谢。