Много хеш-итераций: добавлять соль каждый раз?

Я долгое время использовал несоленый md5/sha1, но так как этот метод не совсем безопасен (а со временем становится все менее безопасным), я решил переключиться на соленый sha512. Кроме того, я хочу замедлить генерацию хэша, используя много итераций (например, 100).

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

Добавлять каждый раз:

// some nice big salt
$salt = hash($algorithm, $salt);

// apply $algorithm $runs times for slowdown
while ($runs--) {
    $string = hash($algorithm, $string . $salt, $raw);
}

return $string;

Добавить один раз:

// add some nice big salt
$string .= hash($algorithm, $salt);

// apply $algorithm $runs times for slowdown
while ($runs--) {
    $string = hash($algorithm, $string, $raw);
}

return $string;

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

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

5 ответов

Решение

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

И, к сведению, я поддерживаю хеширование несколько раз.

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

Да, он представляет уязвимость DOS, но также предотвращает атаки методом "грубой силы" (или, по крайней мере, делает их чрезмерно медленными). Существует абсолютно компромисс, но для некоторых выгоды превышают риски...

Ссылка (больше похожая на обзор) на весь процесс: усиление ключа

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

И еще немного обсуждения по теме:

  1. ХЕКС Предложение
  2. Блог SecurityFocus о хешировании
  3. Статья об алгоритмах хеширования паролей Oracle

И еще несколько ссылок:

  1. PBKDF2 на WikiPedia
  2. Стандарт PBKDF2
  3. Тема электронной почты, которая применима
  4. Просто хеширование далеко не достаточно

Есть множество результатов. Если вы хотите больше, Google hash stretching... Там тонны хорошей информации там...

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

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

Как всегда, вот рекомендуемое прочтение для этого: простого хеширования далеко не достаточно

РЕДАКТИРОВАТЬ: итеративное хеширование является совершенно допустимой тактикой. Есть компромиссы, но все есть. Если вас беспокоит время вычислений, почему бы просто не сохранить незашифрованный пароль?

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

Соленые хэши в OpenSSL

Я предпочитаю использовать двойной sha1 с двумя различными солями и не допускать, чтобы DoS постепенно задерживал ответ (с простым использованием) для каждой проверки неверного пароля.

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

Другие вопросы по тегам