BCRYPT и случайные СОЛИ вместе в базе данных

Я нахожусь в процессе повышения уровня безопасности моего сайта.

При поиске лучшего способа хранения паролей я нашел опцию BCRYPT в PHP 5.3. Я реализовал эту функцию, чтобы использовать статическую ОСВ, однако я прочитал, что каждый пароль должен иметь свою ОСВ или противоречит цели.

Должен ли я хранить соль в базе данных с записью пользователя в виде простого текста? Это также побеждает цель? или я должен хешировать соль, используя md5 и хранить ее в базе данных?

Каков наилучший метод при реализации и хранении ОСВ?

2 ответа

Решение

Модульный формат crypt для bcrypt уже содержит 128-битную соль. Поэтому, если вы не используете реализацию, отличную от этой, вам не нужна другая соль.

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


Jacco напомнил мне, что нативная реализация PHP bcrypt в crypt не генерирует соль автоматически. Таким образом, вы должны сделать это самостоятельно, например:

$salt = substr(str_replace('+', '.', base64_encode(call_user_func_array('pack', array_merge(array('H14N'), explode('.', uniqid('', true)))).pack('N2', mt_rand(), mt_rand()))), 0, 22);
$hash = crypt($password, '$2a$10$'.$salt.'$');

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

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