Я не понимаю, что такое хеш-соль?

Я работаю над добавлением функции генерации хэш-генерации в нашу базу кода. Я хотел использовать String в качестве хеш-соли, чтобы предварительно известный ключ/кодовая фраза мог быть добавлен к тому, что было необходимо для хэширования. Я не понимаю эту концепцию?

Ответы

Ответ 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" может действовать как проходимая соль (у двух разных пользователей будут разные логины), но это не отображает ситуация с данным пользователем, изменяющим его пароль (будет ли новый пароль идентичен старшему паролю).

Ответ 2

Вы прекрасно понимаете концепцию. Просто убедитесь, что добавленная соль повторяется каждый раз.

Ответ 3

Если я правильно вас понимаю, это звучит так, будто у вас все в порядке. Psuedocode для процесса выглядит примерно так:

string saltedValue = plainTextValue + saltString;
// or string saltedalue = saltString + plainTextValue;

Hash(saltedValue);

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

Ответ 4

И еще лучше, если соль различна для каждой зашифрованной фразы, поскольку каждая соль требует свой собственный радужный стол.

Ответ 5

Стоит упомянуть, что, хотя соль для каждого использования паролей должна быть разной, ваша соль должна НЕ ИСПОЛЬЗОВАТЬСЯ КАЖДОЙ ПУТЕМ из самого пароля! Такие вещи имеют практический результат, полностью лишающий вашей безопасности безопасности.