Соление Пароля: Лучшие Практики?


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

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

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

Edit: отличные ответы люди! Я к сожалению я могу выбрать только один ответ. :)

8 152

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@onebyone.livejournal.com:

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

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

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

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

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

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