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 уже делают это. Если вы посмотрите на вывод, вы увидите, что это $
отдельное значение, содержащее соль.