jasypt PBKDF2的实施

时间:2014-03-13 08:06:37

标签: java encryption pbkdf2 jasypt

在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传递。

问题是

  1. 为什么只在加密方法中使用salt和iteration时才调用,当它可以在initialize()方法中完成?

  2. 有什么区别?

  3. 我提出这个问题是因为,由于上面的实现,当迭代次数增加时,encrypt()和decrypt()操作会很慢。

    提前致谢。

1 个答案:

答案 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的作者。