在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传递的salt和迭代计数。
根据PBKDF2,使用密码,盐和迭代计数生成密钥。
在上面的代码中,首先在initialize()方法和salt中生成密钥,迭代计数在encrypt()方法中作为PBEParameterSpec传递。
问题是
为什么只在加密方法中使用salt和iteration时才调用,当它可以在initialize()方法中完成?
有什么区别?
我提出这个问题是因为,由于上面的实现,当迭代次数增加时,encrypt()和decrypt()操作会很慢。
提前致谢。
答案 0 :(得分:1)
对每个加密操作应用salt,因为每个加密的消息使用不同的salt。
initialize()
方法只执行一次,其中所有执行的共同信息(即加密密钥)。而encrypt()
方法必须处理加密参数 --iteration count和salt--,它们对于每个加密操作都是不同的(盐是)。
因此,提高那些encrypt()
和decrypt()
操作的性能的唯一方法是避免为每个加密的消息生成不同的salt,这意味着拥有 fixed-salt生成器< / em>的。 Jasypt 1.9.2包含一项改进,可以检测是否正在使用这种盐生成策略,并且在这种情况下避免在每次加密操作时调用Cipher#init(...)
。有关详细信息,请参阅更改日志:http://www.jasypt.org/changelogs/jasypt/ChangeLog.txt
免责声明,根据StackOverflow规则:我是jasypt的作者。