Один использует соль, чтобы не дать злоумышленнику создать радужную таблицу , например таблицу, содержащую все (обычные) пароли и соответствующие хеши, отсортированные (или как-то легко доступные) по хешу.Если у злоумышленника есть такая таблица или он может ее создать, а затем получает базу данных паролей с несолеными хэшами, он может легко найти пароли даже для всех ваших пользователей сразу.
Если хэши засолены(и злоумышленник получает соль с помощью хешей), он все равно сможет выполнить ту же атаку (только немного больше работы для ввода соли) - но теперь эта работа по созданию радужного стола бесполезна для следующего хеша сдругая соль, что означает, что это нужно будет сделать для каждого пользователя снова. Только это является целью соли.Атака по словарю на ваш аккаунт по-прежнему требует того же времени, что и раньше, просто радужный стол бесполезен.(Чтобы сделать что-то против атаки по словарю, см. Ниже.)
Как именно соль используется, зависит от используемого алгоритма.Некоторые алгоритмы хеширования (например, bcrypt, специально созданный для хеширования паролей) имеют специальный входной параметр соли (или сами генерируют соль и включают его в вывод):
H = bcrypt (пароль, твердость) или H = bcrypt (соль, пароль, твердость)
(первый вариант генерирует саму соль, а второй получает ее извне. Оба включают хеш и параметр твердости ввывод.)
Другие нужно использовать в каком-то особом режиме, чтобы использовать соль.Простой вариант, который работает для большинства алгоритмов хеширования, будет использовать HMAC , с солью как вводом "сообщения", паролем как ключом:
HMAC (пароль, соль) =Хеш (пароль ⊕ opad || Хеш (ipad ⊕ пароль || salt))
где opad и ipad - это некоторые постоянные значения заполнения.
Затем вы сохраняете соль вместе схэш.(Для немного более высокого барьера вы можете хранить хеш в другом месте, чем соль. Но вам все равно понадобятся оба для входа в систему.) Для входа в систему вы передадите пароль и сохраненную соль вашей хэш-функции и сравнитерезультат с сохраненным хешем.(Большинство библиотек bcrypt имеют встроенную функцию проверки пароля, которая делает это.)
Для хранения пароля важно использовать медленный алгоритм хеширования, а не быстрыйВо-первых, чтобы избежать (или на самом деле: замедлить) атаки паролем или перебором по паролям, поскольку у большинства людей пароли довольно короткие. bcrypt - это алгоритм, который был создан именно для этой цели (его медлительность настраивается параметром).
Если вы используете быструю хэш-функцию, обязательно повторяйте ее достаточно часто, чтобыснова медленно(Но лучше, действительно: используйте bcrypt.)