Java jasypt PBKDF2实现

Java jasypt PBKDF2实现,java,encryption,pbkdf2,jasypt,Java,Encryption,Pbkdf2,Jasypt,在org.jasypt.encryption.pbe.StandardPBEByteEncryptor中,当我比较其他几个密钥派生功能时,密钥派生看起来有所不同 initialize()方法具有以下生成密钥的代码: PBEKeySpec pbeKeySpec = new PBEKeySpec(this.password.toCharArray()); SecretKeyFactory factory = SecretKeyFactory.getInstance(this.algorithm)

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

initialize()方法具有以下生成密钥的代码:

PBEKeySpec pbeKeySpec = new PBEKeySpec(this.password.toCharArray());
SecretKeyFactory factory =   SecretKeyFactory.getInstance(this.algorithm);             
this.key = factory.generateSecret(pbeKeySpec);
它没有将salt和迭代计数传递到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);
}
它将salt和迭代计数作为PBEParameterSpec传递

根据PBKDF2,使用密码、salt和迭代计数生成密钥

在上面的代码中,首先在initialize()方法中生成密钥,然后在encrypt()方法中将迭代计数作为PBEParameterSpec传递

问题是

  • 为什么只有在调用encrypt方法时才使用salt和迭代,而可以在initialize()方法中完成

  • 有什么区别

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


    提前感谢。

    salt应用于每个加密操作,因为每个加密的邮件使用不同的salt

    initialize()
    方法只执行一次,所有执行都会使用相同的信息(即加密密钥)。而
    encrypt()
    方法必须考虑加密参数——迭代计数和salt——对于每个加密操作,这两个参数是不同的(salt是不同的)

    因此,提高这些
    encrypt()
    decrypt()
    操作性能的唯一方法是避免为每个被加密的消息生成不同的salt,这意味着有一个固定的salt生成器。Jasypt 1.9.2包括一项改进,检测是否正在使用这种盐生成策略,在这种情况下,避免在每次加密操作中调用
    Cipher#init(…)
    。有关更多信息,请参阅更改日志:


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

    因此,对于每一次加密,它都会使用不同的salt、迭代计数导出一个新密钥,并对消息进行加密?除非您使用FixedSALT生成器实现,否则在这种情况下,它不会。@Danieldernández使用fixed salt生成器的性能提升有多大?