java - jasypt PBKDF2 实现

标签 java encryption pbkdf2 jasypt

在 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/

相关文章:

java - RealmList 排序异步?

java - 如何在 Java 项目中使用 HeidelTime 时间标记器?

java - 如何检查数字是否存在于 JSON 字符串中?

google-chrome - chrome 隐身模式缓存是存储在磁盘还是内存中,是否加密?

iphone - PBKDF2 的 CommonCrypto 替代品

java - 启动时将 Activity 及其布局放置在主 Activity 上

java - 将 C++ 加密转换为 Java

android - 要求在安装应用程序之前对设备进行加密

security - 我可以通过对现有 MD5 哈希加盐并使用 Scrypt 或 PBKDF2 HMACSHA256 对结果进行哈希处理来提高 MD5 哈希密码的安全性吗?

java - PBKDF2 - 无法使用 Node 和 Java 生成相同的 Base64 编码 key