Как хранить соль в распределенной среде

Я не знаю, как использовать "концепцию соли" в моем сценарии.

Предположим, у меня есть клиентское настольное приложение, которое шифрует данные для определенных пользователей и отправляет их на удаленный сервер. Клиентское приложение генерирует ключ с помощью PKCS#5, с паролем пользователя и солью. Удаленный рабочий стол НИКОГДА не должен контактировать с паролем пользователя.

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

Я думаю, что постоянно использовать одну и ту же соль (жестко закодированную в приложении) - не очень хорошая идея (защита от запутывания плохая).

Как я могу решить мою проблему?

3 ответа

Решение

Соль хранится в незашифрованном виде вместе с зашифрованными данными.

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

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

Ни одна из целей не требует, чтобы соль оставалась секретной.

[обновить, разработать]

Смотрите в Википедии запись для соли (криптография). В частности, прочитайте вступительные абзацы.

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

Традиционный пример - хранение зашифрованных паролей. Большинство пользователей надежно выбирают неслучайные пароли, так что без малейших затруднений каждый, кто выберет "SEKRIT" в качестве пароля, получит такой же зашифрованный пароль в базе паролей. Решение состоит в том, чтобы добавить случайную соль перед шифрованием пароля, а затем сохранить ее (в незашифрованном виде) вместе с зашифрованным паролем.

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

В распределенной среде есть один аспект засолки, который не охватывается ни одним из ответов, которые я видел до сих пор. Если у вашего сайта есть несколько баз данных, которые необходимо синхронизировать, как защититься от состояния гонки, при котором случайная соль генерируется на двух или более сайтах почти одновременно. Когда базы данных согласованы, как узнать, какой столбец соли для данной строки является правильным?

ИМХО, аргумент в пользу того, что солт-значение должно быть постоянно пересчитываемой случайной строкой, не был сделан против использования чего-то вроде первичного ключа (PK) для пользовательской строки. Прежде чем ответить в ужасе, выслушай меня.

  • Любая разумная хеш-функция создаст совершенно другой хеш независимо от того, насколько изменяется простой текст (добавляется один или 100 символов).
  • Если вы используете PK, то значение не зависит от всей предоставленной пользователем информации.
  • Как и любое солящее действие, PK-as-salt может быть вставлен алгоритмом в любое место обычного текста. Это не должно быть в начале или в конце.
  • В распределенной среде нет условий гонки по соляному столбу, потому что нет соляного столба.
  • Использование такой подразумеваемой соли, как PK, по-прежнему делает каждый хеш выглядеть по-разному, даже если два пользователя используют один и тот же пароль. Таким образом, идея PK-как-соль делает то, что должна делать соль, без осложнений примирения.
Другие вопросы по тегам