Может ли соль в ключе шифрования отличаться для шифрования и дешифрования?

#java #encryption #salt

#java #шифрование #соль

Вопрос:

У меня есть Java-приложение, которое шифрует и расшифровывает строки. Он генерирует один ключ для шифрования и один для дешифрования.

Генерация ключей:

  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
 char[] passwordChars = password.toCharArray();
 KeySpec spec = new PBEKeySpec(passwordChars, salt.getBytes(), iterations, 256);
 SecretKey key = keyFactory.generateSecret(spec);
 byte[] passwordHash = key.getEncoded();
 SecretKey secretKey = new SecretKeySpec(key.getEncoded(), "AES");
  

Моя цель — чтобы пароль оставался неизменным как для ключа шифрования, так и для ключа дешифрования. Но для каждого из них есть своя соль. Возможно ли это или мне нужно иметь одинаковую соль для обоих ключей?

Всякий раз, когда я пытаюсь изменить соль для ключа дешифрования, я получаю эту ошибку:

 javax.crypto.AEADBadTagException: Tag mismatch!
at java.base/com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:623)
at java.base/com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1118)
at java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1055)
at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:855)
at java.base/com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2207)
  

Комментарии:

1. пожалуйста, укажите соль и итерации.

2. Соль используется для генерации ключа из парольной фразы (с использованием PBKDF2). Изменение соли или количества итераций изменит сгенерированный ключ, так что нет, вы не можете этого сделать, AES использует симметричные ключи, поэтому ключи шифрования и дешифрования должны быть одинаковыми.

3. Итерации = 6000 // соль для ключа1 = «соль» (ключ шифрования) // соль для ключа2 = «тест» (ключ дешифрования). На данный момент это всего лишь тестовое приложение, поэтому я пока не генерирую случайные соли.

4. Спасибо, Марк. Мои ключи шифрования и дешифрования на самом деле разные. Приложение работает до тех пор, пока сгенерированные ключи используют один и тот же пароль, соль и IV. Я просто хотел убедиться, что нет способа рандомизировать соль при каждом поколении ключей.

5. Они могут отличаться между двумя сообщениями, но если вы используете AES-GCM, исходные ключи должны быть одинаковыми. Если вы используете один и тот же пароль / соль / итерацию, ключи будут идентичны. Вы должны изменять параметры только тогда, когда вам нужны разные ключи (например: от одного сообщения к другому), но не между шифрованием и дешифрованием. Вы из первых рук видели, что происходит, когда вы меняете соль.

Ответ №1:

https://crackstation.net/hashing-security.htm — соль должна быть разной для каждого фрагмента зашифрованной информации. Я считаю, что его часто можно получить из других данных пользователя… таким образом, dob фамилия (например) используются в качестве соли для шифрования паролей, чтобы каждый пароль шифровался с разным значением, даже если два пользователя используют один и тот же пароль.

Редактировать: соль должна быть одинаковой для ключа шифрования и дешифрования, но уникальной для отдельных паролей, которые шифруются / расшифровываются. Пожалуйста, прочитайте информацию по URL-адресу для лучшего понимания

Комментарии:

1. Это не отвечает на вопрос. Речь идет не о хешировании паролей, а о генерации симметричного ключа и о том, должны ли параметры быть одинаковыми для шифрования и дешифрования одного сообщения.

2. внес изменения в мой комментарий, чтобы сделать более очевидным, каково решение. Я уверен, что кто-нибудь поправит меня, если я ошибаюсь.

3. Это все еще неправильно. Ваша ссылка касается соления и хеширования паролей, а не функций получения ключей на основе паролей.

4. @Marc: Основной принцип тот же, но использование и реализация разные. В обоих случаях соли используются для предотвращения атак перед вычислением против ключей с низкой энтропией, таких как пароли и парольные фразы.