Использование Jasypt для шифрования AES на основе пароля с ключом PBKDF2WithHmacSHA1

Я использую механизм шифрования там, где работаю, и требования охранника следующие:

  1. Создайте 256-битный ключ, используя PBKDF2WithHmacSHA512, секретный пароль, 256-битную соль и минимум 20000 итераций.
  2. Соль должна быть сгенерирована с помощью SecureRandom.getInstance ("SHA1PRNG");
  3. Зашифруйте с помощью AES256 с производным ключом.

Я пытаюсь использовать класс Jasypt StandardPBEStringEncryptor

encryptor.setPassword(PASSWORD);
encryptor.setAlgorithm("AES/CBC/PKCS5Padding");
encryptor.setKeyObtentionIterations(20000);
encryptor.setSaltGenerator(new RandomSaltGenerator());
encryptor.encrypt("something");

Когда я это сделаю, я получаю следующее исключение:

java.security.NoSuchAlgorithmException: AES / CBC / PKCS5Padding SecretKeyFactory недоступен

Я неправильно использую Jasypt? Что мне здесь не хватает?

Спасибо


person Guy Marom    schedule 06.08.2015    source источник
comment
Если охранник рекомендует шифрование пароля в любой форме или форме, его следует заменить. Вся идея в корне ненадежна. Пароли должны быть хешированы, а не зашифрованы.   -  person user207421    schedule 06.08.2015
comment
Это не для паролей пользователей, а только для некоторых свойств конфигурации, таких как имя пользователя базы данных, пароли базы данных и т. Д. Это данные, которые передаются только в нашей интрасети и зашифрованы для дополнительной безопасности, а не в качестве первой линии защиты.   -  person Guy Marom    schedule 07.08.2015


Ответы (1)


В итоге я связался с Даниэлем Фернандесом, ведущим программистом Jasypt, и получил его ответ:

Боюсь, что Jasypt не предлагает способа указать разные алгоритмы для SecretKeyFactory и создания самого Cipher. Прости.

Для этого я использовал этот кусок java-кода (без Jasypt):

public String encrypt(final String message) {
  final byte[] salt = generateSalt();
  final Key key = createKey(salt);

  final Cipher encryptingCipher = createCipher(Cipher.ENCRYPT_MODE, key, salt);
  final byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
  final byte[] encryptedBytes = doFinal(encryptingCipher, messageBytes);
  final byte[] data = ArrayUtils.addAll(salt, encryptedBytes);
  return BaseEncoding.base64().encode(data);
}

private byte[] generateSalt() {
  final SecureRandom secureRandom = new SecureRandom();
  final byte[] salt = new byte[SALT_LENGTH];
  secureRandom.nextBytes(salt);
  return salt;
}

private Key createKey(final byte[] salt) {
  final PBEKeySpec spec = new PBEKeySpec(PASSWORD,
                                       salt,
                                       ITERATIONS,
                                       KEY_LENGTH);
  final SecretKey secretKey;
  try {
    secretKey = keyFactory.generateSecret(spec);
  } catch (final InvalidKeySpecException e) {
    throw new RuntimeException("Error creating SecretKey", e);
  }
  final SecretKeySpec result = new SecretKeySpec(secretKey.getEncoded(), ALGORITHM);
  spec.clearPassword();
  return result;
}
person Guy Marom    schedule 10.08.2015