Солить ваш пароль: лучшие практики?

162

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

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

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

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

Randolpho
источник
1
Смотрите также: stackoverflow.com/questions/1645161/…
Jacco
1
@Jaccco: потрясающий вклад. Спасибо!
Рандольфо
3
Лучше всего использовать криптографическую функцию, которая выполняет соление за вас, используя PBKDF2 (стандарт), bcrypt или даже scrypt. Спасибо Стивену за то, что указал на это.
Maarten Bodewes
1
Практически все стандартные конструкции хэширования паролей заботятся о сочетании соли и пароля, поэтому вам не стоит об этом беспокоиться. Если вы не используете стандартный хэш пароля, перейдите на него.
CodesInChaos
1
@ Ому Плохая рекомендация. 1) Одна итерация SHA-1 слишком быстрая, вы должны использовать как минимум 10000, и даже это довольно слабо. 2) Соль по умолчанию слишком мала. Минимум 8 байтов, рекомендуется 16.
CodesInChaos

Ответы:

111

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

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

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

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

Георг Шолли
источник
4
Я добавил ссылку на старый вопрос, прочитайте эти ответы. По сути, не используя другую случайную соль для пароля, вы рискуете излишним риском для безопасности, что может стать реальной проблемой в будущем.
Георг Шолли
39
Случайная соль для всего сайта - это плохо, поскольку злоумышленник может предварительно вычислить радужные таблицы и захватить всю пользовательскую базу данных. Если вы этого не понимаете, пожалуйста, не пишите системы входа в систему / безопасности :) - вам НУЖНЫ соли для каждого пользователя.
snemarch
3
Да, соль для каждого пользователя. В идеале, с сохранением итераций для каждого пользователя (чтобы вы могли увеличить количество итераций, используемых со временем). Любая приличная структура будет иметь эту встроенную. (.NET имеет PasswordDeriveBytes, который будет обрабатывать все для вас.)
MichaelGG
2
Если вы разрабатываете какую-либо систему безопасности, она просто не использует соль для каждого пользователя. Ваш сайт может быть не очень интересным, но подумайте о том, что пользователи используют один и тот же пароль на нескольких сайтах ... пытаясь обеспечить безопасность базы данных, как правило, происходит сбой :)
snemarch
2
Конечно, соли защищают от словарных атак, делая их намного медленнее. Использование солей в паролях намного предшествует радужным таблицам. Соли были добавлены специально для того, чтобы замедлить атаки по словарю, не позволяя злоумышленникам хешировать пароль один раз, а затем сравнивать его со всеми пользователями.
Гленн Мейнард
27

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

Факт, что это там, должен победить радужные столы.

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

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

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

Том Риттер
источник
@ Один, блин! Он обнаружил мою соль «парольной соли»!
Самуил
6
@ Сэмюэль: Я не знаю о вас, ребята, но мы используем «12345» для нашей соли. :)
Рандольфо
@ один действительный. Я действительно имел в виду «общий» как «все соли длиной X в наборе символов Y», где X, Y являются разумными; скажем, 20 символов и буквенно-цифровой прописной / строчной буквы. Можно расширить все шестнадцатеричные строки длиной Z (скажем, 160), так как я думаю, что радуга таблица хеш-хэшей была бы полезна ..
Том Риттер
1
@Randolpho: Эй, это тоже моя соль! Каковы шансы?
Адриен
И убедитесь, что соль непредсказуема / Случайно: stackoverflow.com/questions/1645161/…
Jacco
18

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

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

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

Стивен Таусет
источник
1
Что касается последнего абзаца: как злоумышленник может получить какую-либо информацию о точном количестве символов, сравнение не удалось? Это не имеет смысла ..
halloweenlv
1
Вы оба правильные и неправильные. Атаки по времени являются реальными и неоднократно демонстрировали свою жизнеспособность с пугающей точностью даже по сетевым соединениям с переменной задержкой, чтобы точно определить, где сравнение не удалось. Тем не менее, временные атаки на самом деле не применимы к обычным хэшам паролей, поскольку в вычислительном отношении невозможно найти входные данные, которые изменяют только небольшие части выходных данных.
Стивен Таусет
9

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

Фил Х
источник
1
Хеш-коллизии зависят от размера хеша. Благодаря дню рождения проблема столкновений вполне вероятна.
Георг Шолли
2
Только если вы усечете результат. Как бы то ни было, я все еще придерживаюсь того, что не имеет значения, где соль, потому что смысл хэша в том, чтобы отношения между входом и выходом не содержали шаблонов.
Фил Х
7

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

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

snemarch
источник
2
Неправильный ответ: злоумышленник может предварительно вычислить MD (пароль) для многих часто используемых паролей, а затем очень дешево вычислить MD (пароль + соль), поскольку дайджест сообщения работает инкрементно, чтобы поддерживать потоковую передачу.
Эрван Легран
5

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

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

@ Onebyone.livejournal.com:

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

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

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

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

cygil
источник
Вы должны дважды проверить описание раундов. Раунды для каждого чанка, а не для всего сообщения. (В противном случае хэширование потоковых данных потребует перемотки снова и снова.) Но использование итераций предотвращает проблему, о которой кто-то упоминает.
MichaelGG
4

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

Самуил
источник
3
Насколько я знаю, BCrypt Hash нуждается в солении, как и любая другая схема хеширования.
Jacco
2

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

jeffcook2150
источник