Мне нужно хэшировать пароли с солью на postgresql, и я не смог найти соответствующую документацию о том, как это сделать.
Итак, как я могу использовать хэш-пароли (с некоторыми солями) в postgresql?
Мне нужно хэшировать пароли с солью на postgresql, и я не смог найти соответствующую документацию о том, как это сделать.
Итак, как я могу использовать хэш-пароли (с некоторыми солями) в postgresql?
Прошло некоторое время с тех пор, как я задал этот вопрос, и теперь я гораздо больше знаком с криптографической теорией, так что вот более современный подход:
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)
// 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
Сравнить: переход к существующему хешу с помощью:
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)
Есть функции 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 и т.д.).
Вот ссылки для более подробной информации по теме:
Приложение должно использовать свои пароли, используя функцию деривации ключа, такую как bcrypt или pbkdf2. Подробнее о безопасном хранении паролей.
... но иногда вам все еще нужны криптографические функции в базе данных.
Вы можете использовать pgcrypto, чтобы получить доступ к sha256, который является членом семейства sha2. Имейте в виду, что sha0, sha1 md4 и md5 очень сломанны, и для хэшей паролей использовать никогда.
Ниже приведен алгоритм хэширования паролей:
digest("salt"||"password"||primary_key, "sha256")
Соль должна быть большим случайным образом генерируемым значением. Эта соль должна быть защищена, поскольку хеши нельзя разрушить до тех пор, пока соль не будет восстановлена. Если вы храните соль в базе данных, ее можно получить вместе с хэшем пароля с использованием SQL-инъекции. Конкатенация первичного ключа используется для предотвращения того, что 2 человека имеют один и тот же пароль, даже если у них одинаковый пароль. Конечно, эту систему можно было бы улучшить, но это намного лучше, чем в большинстве систем, которые я видел.
Как правило, лучше всего делать хеширование в своем приложении до того, как оно попадет в базу данных. Это связано с тем, что запросы могут отображаться в журналах, и если сервер базы данных принадлежит, они могут включить ведение журнала, чтобы получить четкие текстовые пароли.
Примеры и документация по: http://www.postgresql.org/docs/8.3/static/pgcrypto.html
UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));
SELECT pswhash = crypt('entered password', pswhash) FROM ... ;