2

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

问题是

  1. 为什么盐和迭代仅在调用 encrypt 方法期间使用,而它可以在 initialize() 方法中完成?

  2. 有什么区别?

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

提前致谢。

4

1 回答 1

1

盐应用于每个加密操作,因为每个加密的消息使用不同的盐。

initialize()方法只执行一次,其信息对所有执行都是通用的(即加密密钥)。而该encrypt()方法必须注意加密参数——迭代计数和盐——对于每个加密操作来说它们是不同的(盐是)。

因此,提高这些encrypt()decrypt()操作性能的唯一方法是避免为每条被加密的消息生成不同的盐,这意味着拥有一个固定的盐生成器。Jasypt 1.9.2 包含一项改进,可检测是否使用了这种盐生成策略,并在这种情况下避免调用Cipher#init(...)每个加密操作。有关更多信息,请参阅更改日志:http ://www.jasypt.org/changelogs/jasypt/ChangeLog.txt

免责声明,根据 StackOverflow 规则:我是 jasypt 的作者。

于 2014-03-14T09:13:48.160 回答