реализация jasypt PBKDF2

В 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(), а соль и количество итераций передаются как PBEParameterSpec в методе encrypt().

Вопрос в том

  1. Почему соль и итерация используются только во время вызова метода шифрования, когда это можно сделать внутри метода initialize()?

  2. В чем разница?

Я поднимаю этот вопрос, потому что из-за приведенной выше реализации операции encrypt() и decrypt() выполняются медленно при увеличении количества итераций.

Заранее спасибо.


person jaghan    schedule 13.03.2014    source источник


Ответы (1)


Соль применяется для каждой операции шифрования, поскольку для каждого зашифрованного сообщения используется разная соль.

Метод initialize() выполняется только один раз с информацией, которая будет общей для всех исполнений (т. е. с ключом шифрования). В то время как метод encrypt() должен заботиться о параметрах шифрования --количестве итераций и соли--, которые различны (соль) для каждой операции шифрования.

Таким образом, единственный способ повысить производительность этих операций encrypt() и decrypt() — избежать создания разных солей для каждого зашифрованного сообщения, а это означает наличие генератора фиксированных солей. Jasypt 1.9.2 включает улучшение, которое определяет, используется ли такая стратегия генерации соли, и в этом случае избегает вызова Cipher#init(...) при каждой операции шифрования. Дополнительную информацию см. в журнале изменений: http://www.jasypt.org/changelogs/jasypt/ChangeLog.txt

Отказ от ответственности в соответствии с правилами StackOverflow: я автор jasypt.

person Daniel Fernández    schedule 14.03.2014
comment
Итак, для каждого шифрования он получает новый ключ, используя другую соль, количество итераций и шифрует сообщение? - person jaghan; 14.03.2014
comment
Если вы не используете реализацию FixedSaltGenerator, в этом случае она не будет. - person Daniel Fernández; 16.03.2014
comment
@DanielFernández, насколько велик прирост производительности с генератором с фиксированной солью? - person kozla13; 24.02.2015