gpt4 book ai didi

java - jasypt PBKDF2 实现

转载 作者:行者123 更新时间:2023-11-30 11:21:09 26 4
gpt4 key购买 nike

在 org.jasypt.encryption.pbe.StandardPBEByteEncryptor 中,当我比较其他几个 key 派生功能时, key 派生看起来有所不同。

initialize() 方法具有以下用于生成 key 的代码:

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, key 是使用密码、salt 和迭代计数生成的。

在上面的代码中, key 首先在 initialize() 方法中生成,salt、迭代计数在 encrypt() 方法中作为 PBEParameterSpec 传递。

问题是

  1. 为什么盐和迭代只在调用加密方法时使用,而它可以在 initialize() 方法中完成?

  2. 有什么不同?

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

提前致谢。

最佳答案

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

initialize() 方法只执行一次,其信息对所有执行都是通用的(即加密 key )。而 encrypt() 方法必须处理加密参数 --iteration count 和 salt--,它们对于每个加密操作都是不同的(salt 是)。

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

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

关于java - jasypt PBKDF2 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22372553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com