Как я могу использовать хэш-пароли в postgresql?

Мне нужно хэшировать пароли с солью на postgresql, и я не смог найти соответствующую документацию о том, как это сделать.

Итак, как я могу использовать хэш-пароли (с некоторыми солями) в postgresql?

Ответ 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 и т.д.).

Вот ссылки для более подробной информации по теме:

Ответ 2

Приложение должно использовать свои пароли, используя функцию деривации ключа, такую ​​как bcrypt или pbkdf2. Подробнее о безопасном хранении паролей.

... но иногда вам все еще нужны криптографические функции в базе данных.

Вы можете использовать pgcrypto, чтобы получить доступ к sha256, который является членом семейства sha2. Имейте в виду, что sha0, sha1 md4 и md5 очень сломанны, и для хэшей паролей использовать никогда.

Ниже приведен алгоритм хэширования паролей:

digest("salt"||"password"||primary_key, "sha256")

Соль должна быть большим случайным образом генерируемым значением. Эта соль должна быть защищена, поскольку хеши нельзя разрушить до тех пор, пока соль не будет восстановлена. Если вы храните соль в базе данных, ее можно получить вместе с хэшем пароля с использованием SQL-инъекции. Конкатенация первичного ключа используется для предотвращения того, что 2 человека имеют один и тот же пароль, даже если у них одинаковый пароль. Конечно, эту систему можно было бы улучшить, но это намного лучше, чем в большинстве систем, которые я видел.

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