Мне нужно хэшировать некоторые пароли с помощью соли в 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
Сравните :pass к существующему хешу с:
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
Создайте хэш :password с большой случайной солью:
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
В php 5.5 и выше есть password_*
функций, которые позволяют тривиально просто хешировать пароли с помощью 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 и т. д.).
Вот ссылки для дополнительного чтения по теме:
password_hash()
в эти дни, если вы можете это сделать. Bcrypt — это современный уровень хеширования паролей, поэтому он превосходит другие варианты, будь то в postgresql или php. Хеширование Bcrypt является ресурсоемким по своей конструкции, поэтому, если вы используете его в php, попробуйте получить доступ к bcrypt из crypt(), чтобы уменьшить использование ресурсов вашего сервера.
- person Kzqai; 19.10.2014
scram-sha-256
(от RFC 7677). Поскольку он использует SCRAM, в некоторых случаях он может быть альтернативой password_*
-функциям PHP.
- person Code4R7; 31.12.2019
Приложение должно хэшировать свои пароли, используя функцию получения ключа, такую как bcrypt или pbkdf2. Дополнительная информация о безопасном хранении паролей.
... но иногда вам все еще нужны криптографические функции в базе данных.
Вы можете использовать pgcrypto, чтобы получить доступ к sha256, который является членом Семья Ша2. Имейте в виду, что sha0, sha1 md4 и md5 очень повреждены и не должны никогда использоваться для хэшей паролей.
Ниже приведен хороший метод хеширования паролей:
digest("salt"||"password"||primary_key, "sha256")
Соль должна быть большим случайно сгенерированным значением. Эта соль должна быть защищена, потому что хэши не могут быть взломаны, пока соль не будет восстановлена. Если вы храните соль в базе данных, ее можно получить вместе с хэшем пароля с помощью sql-инъекции. Объединение первичного ключа используется для предотвращения того, чтобы 2 человека имели одинаковый хэш пароля, даже если у них одинаковый пароль. Конечно, эту систему можно было бы улучшить, но она намного лучше, чем большинство систем, которые я видел.
Как правило, лучше всего выполнять хеширование в приложении до того, как оно попадет в базу данных. Это связано с тем, что запросы могут отображаться в журналах, и если сервер базы данных принадлежит, они могут включить ведение журнала для получения паролей в открытом виде.
update account set pswhash = crypt('global salt' || 'new password' || 'user created date', gen_salt('sha256')) where account_id = 5
или что-то в этом роде для создания начального хэша? Или я что-то упустил в функции crypt()?
- person Kzqai; 15.04.2010
pswhash = digest('global salt'||"password"||primary_key, "sha256")
Использование идентификатора гарантирует, что полученный хеш будет неверным, даже если 2 человека используют один и тот же пароль и создают учетную запись в один и тот же день. Вы можете внести некоторые улучшения в генерацию соли, но это намного лучше, чем большинство реализаций, которые я видел.
- person rook; 15.04.2010
Примеры и документация по: 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 ... ;
update account set pswhash = crypt('global salt' || 'new password' || 'user created date', gen_salt('sha256')) where account_id = 5
? или соление все еще ручной процесс?
- person Kzqai; 15.04.2010
digest
для шифрования паролей, это недостаточно безопасно. Просто убедитесь, что вы используете алгоритм Blowfish, а не MD5.
- person GetFree; 05.06.2013