Я бы выбрал хранение соли вместе с идентификатором алгоритма хеширования и самим хэшем.
Вот почему:
Обычно доступ к базе данных ограничен localhost
или некоторым предварительно заданным диапазоном IP-адресов. Это означает, что для того, чтобы хакер получил доступ к вашей базе данных, он / она должен был бы скомпрометировать файловую систему вашего сервера (либо получив прямой доступ, либо внедрив скрипт). Или выполнить SQL-инъекцию.
В первом случае это означало бы, что если кто-то получит доступ к вашим солям в БД, он / она сможет так же легко прочитать их из вашего источника PHP-файлов.
Последняя причина может быть просто предотвращена путем использования подготовленных операторов с PDO или MySQLi . Вам больше не следует использовать старые функции mysql_*
в качестве API. Они больше не поддерживаются, и процесс устаревания уже начался .
Даже если кто-то попадет в вашу базу данных, это не так уж проблематично. Если вы используете функцию crypt()
для создания хэшей с хорошими алгоритмами (рекомендуется CRYPT_BLOWFISH
), то взлом даже одного пароля может быть очень длинным (в масштабе лет). К этому времени вы можете легко отправлять уведомления об «изменении пароля» пользователям и блокировать всех, кто еще этого не сделал.
Если вы используете PHP 5.5+, вы должны вместо этого использовать новый API паролей: http://php.net/password