Солить свой пароль: передовой опыт?

Мне всегда было любопытно ... Что лучше солить пароль для хеширования: префикс или постфикс? Почему? Или это имеет значение, если вы солите?

Чтобы объяснить: мы все (надеюсь) к настоящему времени знаем, что мы должны солить пароль перед мы хэшируем его для хранения в базе данных [Edit: чтобы вы могли избежать таких вещей, как что случилось недавно с Джеффом Этвудом]. Обычно это делается путем объединения соли с паролем перед передачей его через алгоритм хеширования. Но примеры различаются ... В некоторых примерах соль перед паролем. В некоторых примерах добавляется соль после пароля. Я даже видел, как некоторые пытаются добавить соль в середину.

Итак, какой метод лучше и почему? Есть ли метод, уменьшающий вероятность хеш-коллизии? Мой поиск в Google не дал достойного анализа по этому поводу.

Изменить: Отличные ответы, ребята! Мне жаль, что я смог выбрать только один ответ. :)


person Randolpho    schedule 23.03.2009    source источник
comment
См. Также: stackoverflow.com / questions / 1645161 /   -  person Jacco    schedule 11.08.2010
comment
вы можете использовать это: encrypto.codeplex.com, это для .net   -  person Omu    schedule 14.09.2010
comment
@Omu: Хм ... который использует 4-байтовую случайную соль и хранит ее с хешированным паролем. Последнее умно, но первое ... Я думаю, что это немного занижено. Тем не менее, это полезно, если вам нужно быстрое и грязное хеширование паролей.   -  person Randolpho    schedule 14.09.2010
comment
@Randolpho вы можете указать размер соли, по умолчанию 4 байта   -  person Omu    schedule 14.09.2010
comment
@Omu: Ах, ты прав. Я пропустил это.   -  person Randolpho    schedule 14.09.2010
comment
Лучше всего использовать криптографическую функцию, которая выполняет за вас солидарность, используя либо PBKDF2 (стандарт), либо bcrypt, либо даже scrypt. Спасибо Стивену за указание на это.   -  person Maarten Bodewes    schedule 13.08.2012
comment
Практически все стандартные конструкции хеширования паролей заботятся об объединении соли и пароля, поэтому вам не стоит об этом беспокоиться. Если вы не используете стандартный хэш пароля, перейдите на него.   -  person CodesInChaos    schedule 16.08.2013
comment
@Omu Плохая рекомендация. 1) Одна итерация SHA-1 слишком быстрая, вы должны использовать не менее 10000, и даже это довольно слабо. 2) По умолчанию слишком мало соли. Минимум 8 байт, рекомендуется 16.   -  person CodesInChaos    schedule 16.08.2013
comment
Исправьте, пожалуйста, ссылку. Она не работает: |   -  person Shekhar Pankaj    schedule 11.11.2016
comment
@ShekharPankaj, обе ссылки в моем сообщении все еще работают у меня отлично.   -  person Randolpho    schedule 14.11.2016


Ответы (8)


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

Вы должны учитывать эти три вещи:

  1. Соль должна быть разной для каждого пароля, который вы храните. (Это довольно распространенное заблуждение.)
  2. Используйте криптографически безопасный генератор случайных чисел.
  3. Выберите достаточно длинную соль. Подумайте о проблеме дня рождения.

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

person Georg Schölly    schedule 23.03.2009
comment
Как гуру, не занимающийся вопросами безопасности, я не совсем понимаю пункт 1. Достаточно ли hashed_pw = hash (canned_salt + login + password) или вам нужно хранить соль вместе с паролем? Любые указания на то, почему? - person wowest; 23.03.2009
comment
Я добавил ссылку на старый вопрос, прочтите эти ответы. По сути, не используя другую случайную соль для пароля, вы подвергаетесь ненужному риску безопасности, что может стать реальной проблемой в будущем. - person Georg Schölly; 23.03.2009
comment
Если вы читаете его ответ, он говорит, что вам следует использовать случайную соль вместо имени пользователя или других пользовательских данных. Использование случайной соли с одной стороны по-прежнему в силе. - person Samuel; 23.03.2009
comment
Должен быть достаточно безопасным, если у вас не много пользователей и хакер не создает радужную таблицу только для вашего сайта. - person Georg Schölly; 23.03.2009
comment
Да, все еще очень безопасно. Возможно, вы захотите, чтобы он был более безопасным, чтобы вы могли генерировать соль для каждого пользователя. - person Samuel; 23.03.2009
comment
Случайная соль для всего сайта - это плохо, поскольку злоумышленник может предварительно вычислить радужные таблицы и захватить всю вашу базу данных пользователей. Если вы этого не понимаете, пожалуйста, не пишите системы входа / безопасности :) - вам НУЖНЫ индивидуальные соли для каждого пользователя. - person snemarch; 23.03.2009
comment
Да, соль для каждого пользователя. В идеале, с сохранением итераций для каждого пользователя (чтобы вы могли увеличить количество используемых итераций с течением времени). Любой достойный фреймворк будет иметь это встроенное. (В .NET есть PasswordDeriveBytes, который все сделает за вас.) - person MichaelGG; 24.03.2009
comment
Соли вам совсем не нужны. Вы должны иметь соли. А что касается того, нужны ли вам соли для каждого пользователя, все зависит от стимула для кого-то скомпрометировать ваши учетные записи. Если есть большой стимул, вам нужно на каждого пользователя, так как скомпрометировать всех пользователей будет очень дорого. - person Samuel; 24.03.2009
comment
Вам вообще не нужны соли - черт возьми, вам вообще не нужно хеширование, если вы думаете, что можете сохранить свою базу данных в секрете ;-) - person Steve Jessop; 24.03.2009
comment
Если вы разрабатываете какую-либо систему безопасности, то безнадежно отказываться от соли для каждого пользователя. ваш сайт может быть не очень интересным, но рассмотрите возможность пользователей, использующих один и тот же пароль на нескольких сайтах ... попытки сохранить базу данных в безопасности обычно терпят неудачу :) - person snemarch; 24.03.2009
comment
Соли не защищают от словарных атак, только от радужных таблиц. Но он прав в том, что это значительно замедляет такую ​​атаку. - person Georg Schölly; 24.03.2009
comment
Конечно, соли защищают от словарных атак, именно за счет того, что они намного медленнее. Использование солей в паролях появилось намного раньше, чем радужные таблицы. Соли были добавлены специально, чтобы замедлить атаки по словарю, не позволяя злоумышленникам хешировать пароль один раз, а затем сравнивать его со всеми пользователями. - person Glenn Maynard; 05.03.2012
comment
Злоумышленник может предварительно вычислить MD (проход) для многих часто используемых паролей, а затем вычислить MD (проход + соль) по более низкой цене для каждой соли в базе данных паролей, поскольку дайджесты сообщений работают поэтапно, чтобы поддерживать потоковую передачу. - person Erwan Legrand; 18.12.2013

Думаю, все дело в семантике. Помещение его до или после не имеет значения, за исключением очень конкретной модели угрозы.

Тот факт, что он есть, должен побеждать радужные таблицы.

Модель угрозы, о которой я упоминал, будет сценарием, в котором злоумышленник может добавить / добавить к паролю радужные таблицы общих солей. (Скажем, АНБ). Вы предполагаете, что они либо добавили его, либо добавили в начале, но не то и другое вместе. Это глупо, и это плохое предположение.

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

Как я сказал. Это семантика. Выберите другую соль для пароля, длинную соль, и включите в нее нечетные символы, такие как символы и коды ASCII: © ¤¡

person Tom Ritter    schedule 23.03.2009
comment
@onebyone, блин! Он обнаружил мою соль пароля! - person Samuel; 24.03.2009
comment
@Samuel: Я не знаю, как вы, ребята, но мы используем «12345» в качестве соли. :) - person Randolpho; 24.03.2009
comment
@onebyone действительный. Я действительно имел в виду общие, поскольку все соли под длиной X в наборе символов Y, где X, Y разумны; скажем, 20 символов и буквенно-цифровые символы в верхнем / нижнем регистре. Расширяемый, чтобы сказать все шестнадцатеричные строки длиной Z (скажем 160), так как я думаю, что радужная таблица хешированных хешей была бы полезна. - person Tom Ritter; 24.03.2009
comment
@Randolpho: Эй, это тоже моя соль! Какие шансы? - person Adrien; 27.05.2009
comment
И убедитесь, что соль непредсказуема / Случайно: stackoverflow.com/questions/1645161/ - person Jacco; 26.12.2009
comment
Соляные пароли задолго до радужных таблиц. - person Glenn Maynard; 05.03.2012

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

HMAC - лучший подход, но даже тогда, если вы используете что-то вроде SHA-1 , вы уже выбрали алгоритм, который не подходит для хеширования паролей из-за его скорости. Используйте что-то вроде bcrypt или, возможно, scrypt и полностью избавьтесь от проблемы.

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

person Stephen Touset    schedule 05.07.2012
comment
Относительно последнего абзаца: как злоумышленник может получить какую-либо информацию о точном количестве символов, сравнение которых не удалось? Это не имеет никакого смысла.. - person halloweenlv; 19.11.2017
comment
Вы и правы, и неправы. Временные атаки реальны и неоднократно демонстрировали свою жизнеспособность с пугающей точностью даже при переменной задержке. сетевые подключения, чтобы точно определить, где не удалось выполнить сравнение. Тем не менее, временные атаки на самом деле неприменимы к обычным хэшам паролей, поскольку с вычислительной точки зрения невозможно найти входные данные, которые изменяют только небольшие части выходных данных. - person Stephen Touset; 22.11.2017

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

person Phil H    schedule 23.03.2009
comment
Коллизии хэшей зависят от размера хэша. Из-за проблемы с днем ​​рождения весьма вероятны коллизии. - person Georg Schölly; 24.03.2009
comment
Только если обрезать результат. В любом случае, я по-прежнему придерживаюсь того мнения, что не будет иметь значения, где находится соль, потому что суть хэша заключается в том, чтобы отношения между вводом и выводом не содержали шаблонов. - person Phil H; 24.03.2009

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

Однако важно использовать длинные соли, генерировать их с помощью правильного криптографического ГПСЧ и иметь соли для каждого пользователя. Хранение солей для каждого пользователя в вашей базе данных не проблема безопасности, а использование хеша для всего сайта .

person snemarch    schedule 23.03.2009
comment
Неверный ответ: злоумышленник может предварительно вычислить MD (pass) для многих часто используемых паролей, а затем очень дешево вычислить MD (pass + salt), потому что дайджест сообщения работает поэтапно, чтобы поддерживать потоковую передачу. - person Erwan Legrand; 18.12.2013

Прежде всего, термин «радужная таблица» постоянно используется неправильно. Радужная таблица - это просто особый вид таблицы поиска, который допускает определенный вид сжатия данных на ключах. При обмене вычислений на пространство справочная таблица, которая занимала бы 1000 ТБ, может быть сжата тысячу раз, чтобы ее можно было сохранить на меньшем диске.

Вам следует побеспокоиться о хеш-значениях таблиц поиска паролей, о радуге и т. Д.

@ onebyone.livejournal.com:

У злоумышленника есть «радужные таблицы», состоящие не из хэшей словарных слов, а из состояния вычисления хэша непосредственно перед завершением вычисления хэша.

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

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

Более того, алгоритмы хеширования паролей, такие как PBKDF, составляют свою хэш-функцию несколько раз (рекомендуется повторять PBKDF-2 минимум 1000 раз, каждая итерация применяет SHA-1 дважды), что делает эту атаку вдвойне непрактичной.

person cygil    schedule 24.03.2009
comment
Вам следует дважды проверить описание раундов. Раунды выполняются по частям, а не по всему сообщению. (В противном случае хеширование потоковых данных потребовало бы повторной перемотки снова и снова.) Но использование итераций действительно предотвращает проблему, о которой каждый упоминает. - person MichaelGG; 25.03.2009

BCrypt hash, если у платформы есть провайдер. Мне нравится, что вы не беспокоитесь о создании солей и можете сделать их еще сильнее, если хотите.

person Samuel    schedule 23.03.2009
comment
Насколько я знаю, BCrypt Hash нуждается в солении, как и любая другая схема хеширования. - person Jacco; 12.08.2010

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

person jeffcook2150    schedule 23.03.2009