Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как я могу хешировать пароли в postgresql?

Автор вопроса: KzqaiОтветов: 3

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

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

postgresqlsecuritycryptographyhashsalt

Ответы

Ответ 1 · рейтинг 93 · Kzqai

Прошло некоторое время с тех пор, как я задал этот вопрос, и теперь я гораздо лучше знаком с криптографической теорией, поэтому вот более современный подход:

Рассуждение

  • Не используйте md5. Не используйте один цикл быстрых хэшей семейства sha. Быстрые хэши помогают злоумышленникам, так что вам это не нужно.
  • Вместо этого используйте ресурсоемкий хэш, такой как 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() в запросах

Сравните :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)

Немного предпочтительнее хэширование bcrypt из-в-Php.

В 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 и т. д.).

Вот ссылки для дополнительного чтения по теме:

Ответ 2 · рейтинг 16 · rook

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

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

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

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

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

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

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

Ответ 3 · рейтинг 9 · Matej Puntar

Примеры и документация по: 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 ... ;

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы