Ответ 1
Прошло некоторое время с тех пор, как я задал этот вопрос, и теперь я гораздо больше знаком с криптографической теорией, так что вот более современный подход:
Рассуждение
- Не используйте md5. Не используйте один цикл быстрых хэсов sha-family. Быстрые хэши помогают злоумышленникам, поэтому вы этого не хотите.
- Вместо этого используйте хэширование ресурсов, например bcrypt. Bcrypt проверяется временем и масштабируется, чтобы быть надежным в будущем.
- Не беспокойтесь о том, чтобы катать свою соль, вы можете испортить свою собственную безопасность или переносимость, полагайтесь на gen_salt(), чтобы генерировать ее удивительные уникальные для каждого из них соли.
- В общем, не будьте идиотом, не пытайтесь писать свой собственный доморощенный крипто, просто используйте то, что предоставили умные люди.
Пакеты Debian/Ubuntu для установки
sudo apt-get install postgresql // (of course)
sudo apt-get install postgresql-contrib libpq-dev // (gets bcrypt, crypt() and gen_salt())
sudo apt-get install php5-pgsql // (optional if you're using postgresql with php)
Активировать crypt() и bcrypt в postgresql в вашей базе данных
// Create your database first, then:
cd `pg_config --sharedir` // Move to the postgres directory that holds these scripts.
echo "create extension pgcrypto" | psql -d yOuRdATaBaSeNaMe // enable the pgcrypo extension
Используйте crypt() и gen_salt() в запросах
Сравнить: переход к существующему хешу с помощью:
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
Создайте хэш: пароль с большой случайной солью:
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
Хеширование bcrypt From-in-Php немного предпочтительнее
Есть функции password_*
в php 5.5 и выше, которые позволяют тривиально простое хеширование паролей с помощью bcrypt (около времени!), и есть версия библиотеки обратной совместимости для версий ниже этого. Как правило, это хеширование возвращается к завершению системного вызова linux для более низкого использования ЦП в любом случае, хотя вы можете захотеть убедиться, что оно установлено на вашем сервере. Смотрите: https://github.com/ircmaxell/password_compat (требуется php 5.3.7 +)
Будьте внимательны при регистрации
Обратите внимание, что с помощью pg_crypto пароли находятся в открытом тексте во время передачи из браузера, в php, в базу данных. Это означает, что они могут быть зарегистрированы в текстовом тексте из запросов, если вы не будете осторожны с журналами базы данных. например наличие медленного журнала запросов postgresql может ловить и регистрировать пароль из выполняемого запроса на вход.
В резюме
Используйте php bcrypt, если это возможно, это уменьшит время, когда пароль останется неповрежденным. Попробуйте убедиться, что в вашей Linux-системе установлен bcrypt crypt()
, чтобы это было выполнено. Рекомендуется обновить, по крайней мере, php 5.3.7+, так как реализация php немного глючит от php 5.3.0 до 5.3.6.9 и ненадлежащим образом возвращается к сломанному DES
без предупреждения в php 5.2.9 и ниже.
Если вы хотите/нуждаетесь в хэшировании postgres, установка bcrypt - это путь, поскольку установленные хэши по умолчанию старые и сломанные (md5 и т.д.).
Вот ссылки для более подробной информации по теме: