Ответ 1
Соль представляет собой случайный элемент, который добавляется ко входному сигналу криптографической функции, с целью воздействия на обработку и вывод в явном виде на каждый вызов. Соль, в отличие от "ключа", не должна быть конфиденциальной.
Столетие назад криптографические методы шифрования или аутентификации были "секретными". Затем, с появлением компьютеров, люди поняли, что хранить метод полностью секретно было сложно, потому что это означало сохранение конфиденциальности программного обеспечения. Что-то, что регулярно записывается на диск или воплощается как какое-то выделенное оборудование, не может быть конфиденциальным. Таким образом, исследователи разделяют "метод" на два разных понятия: алгоритм (который является общедоступным и становится программным и аппаратным) и ключом (параметр для алгоритма, присутствующий в энергозависимой ОЗУ только во время обработки). Ключ концентрирует секрет и представляет собой чистые данные. Когда ключ хранится в мозгу человека, его часто называют "паролем", потому что люди лучше запоминают слова, чем биты.
Затем сам ключ был разделен позже. Оказалось, что для правильной криптографической безопасности нам нужны две вещи: конфиденциальный параметр и переменный параметр. В принципе, повторное использование одного и того же ключа для разных применений имеет тенденцию создавать проблемы; он часто течет информацией. В некоторых случаях (особенно потоковые шифры, а также для хэширования паролей) он слишком сильно протекает и приводит к успешным атакам. Поэтому часто возникает необходимость в изменчивости, которая меняется каждый раз при запуске криптографического метода. Теперь хорошая часть состоит в том, что большую часть времени, изменчивость и секрет не нужно объединять. То есть мы можем отделить конфиденциальность от переменной. Таким образом, ключ был разделен на:
- секретный ключ, который часто называют "ключом";
- переменный элемент, обычно выбираемый случайным образом и называемый "соль" или "IV" (как "начальное значение" ) в зависимости от типа алгоритма.
Только ключ должен быть секретным. Элемент переменной должен быть известен всем участвующим сторонам, но он может быть общедоступным. Это благословение, потому что разделять секретный ключ сложно; системы, используемые для распространения такого тайна, посчитали бы дорогостоящим для размещения переменной части, которая изменяется каждый раз, когда выполняется алгоритм.
В контексте хранения хэшированных паролей приведенное выше объяснение становится следующим:
- "Повторное использование ключа" означает, что два пользователя выбирают один и тот же пароль. Если пароли просто хэшируются, то оба пользователя получат одинаковое значение хэша, и это покажет. Вот утечка.
- Аналогично, без хэширования, злоумышленник может использовать предварительно вычисляемые таблицы для быстрого поиска; он также может атаковать тысячи паролей параллельно. Это все еще использует ту же утечку, только таким образом, который показывает, почему эта утечка плохая.
- Соление означает добавление некоторых переменных данных в вход хеш-функции. Эти переменные данные являются солью. Точка соли заключается в том, что два разных пользователя должны использовать, насколько это возможно, соли. Но верификаторы паролей должны иметь возможность пересчитывать один и тот же хэш из пароля, следовательно, они должны иметь доступ к соли.
Так как соль должна быть доступна для верификаторов, но не обязательно должна быть секретной, обычно хранить значение соли вместе с хеш-значением. Например, в системе Linux я могу использовать эту команду:
openssl passwd -1 -salt "zap" "blah"
Это вычисляет хешированный пароль с хеш-функцией MD5, подходящей для использования в файле /etc/password
или /etc/shadow
для пароля "blah"
и соли "zap"
(здесь я выбираю соль явно, но в практических условиях его следует выбирать случайным образом). Выход будет следующим:
$1$zap$t3KZajBWMA7dVxwut6y921
в котором знаки доллара служат разделителями. Начальный "1"
идентифицирует метод хеширования (MD5). Соль находится там, в виде открытого текста. Последняя часть - выход хэш-функции.
Существует спецификация (где-то) о том, как соль и пароль отправляются в качестве входных данных для хеш-функции (по крайней мере, в исходном коде glibc, возможно, в другом месте).
Изменить: в системе аутентификации пользователя "login-and-password", "login" может действовать как проходимая соль (у двух разных пользователей будут разные логины), но это не отображает ситуация с данным пользователем, изменяющим его пароль (будет ли новый пароль идентичен старшему паролю).