Шифрование: нужно ли солить ключ, когда он вообще не хранится?

Я искал по всей сети, в том числе здесь, на SO: много обсуждается необходимость солить пароли перед их хешированием и хранением.

В случае, если пароль используется для вычисления ключа, используемого для шифрования («Шифрование на основе пароля»): что, если вы вообще не храните пароль?

Предположим:

Для шифрования

  1. пользователь вводит мастер-пароль
  2. это хешированный SHA256, и выходные данные используются для шифрования файла с помощью AES256.
  3. хэш не сохраняется (и, очевидно, не является мастер-паролем)

Для расшифровки

  1. Пользователь вводит мастер-пароль
  2. Это хешированный SHA256, вывод используется для расшифровки файла.
  3. Если расшифровка прошла успешно, значит, пароль был - по всей видимости - верным.

Мой вопрос:

Если ничего не хранится, кроме самого зашифрованного файла, есть ли польза от использования мастер-пароля перед его хешированием?

Рекомендации:

  • это, вероятно, уменьшит вероятность хеш-коллизии
  • это потребует хранения соли.
  • если соль была потеряна / повреждена, пользователь больше не сможет расшифровать файл

  • как проверить успешность дешифрования на шаге 3: требуется ли для этого известность части содержимого файла?

  • если да, то какая часть бестактности хранит известное значение в зашифрованном файле (это не всегда можно предотвратить - злоумышленник может предположить, что, например, фамилия пользователя зашифрована где-то в файле - это верно).

person Wouter    schedule 09.08.2011    source источник


Ответы (1)


Если вы не храните мастер-пароль, то нет необходимости его солить. Если вы повторно используете мастер-пароль для создания большого количества одноразовых паролей, его нужно будет хранить в зашифрованном виде и при необходимости расшифровывать.

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

Salt предназначен для хеширования в долгосрочном хранилище, IV предназначен для шифрования с использованием режима CBC (или режима CTR, где его также можно назвать nonce).

Что касается проверки правильности расшифровки вашего файла, просто убедитесь, что вы используете заполнение, такое как PKCS7. Когда последний блок будет расшифрован, заполнение будет проверено, чтобы убедиться, что он находится в правильном формате. Если расшифровка завершилась неудачно, заполнение не будет правильно отформатировано, и вы должны получить ошибку «Не удалось заполнить заполнение».

person rossum    schedule 09.08.2011
comment
Четкий ответ, ни запоминания, ни засолки. Кроме того, я использую заполнение PKCS7 и проверил: обычный шифровальщик действительно красиво возвращает ошибку, если ему предоставлен неверный ключ; нет необходимости проверять содержимое файла. - person Wouter; 09.08.2011
comment
Обновление: последнее уже не соответствует действительности. CCCrypt теперь всегда возвращает успех. Форумы Apple Dev - person Wouter; 04.11.2014
comment
Если установлено NoPadding, будет приниматься любой старый мусор. Лучше всего проверить свои настройки, а затем намеренно попытаться расшифровать неверным ключом. - person rossum; 04.11.2014