PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как мога да хеширам пароли в postgresql?

Измина известно време, откакто зададох този въпрос и сега съм много по-запознат с криптографската теория, така че ето по-модерния подход:

Разсъждение

  • Не използвайте 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)

От-в-Php bcrypt хеширането е малко за предпочитане

Има 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 и т.н.).

Ето препратки за повече четене по темата:

  • http://codahale.com/how-to-safely-store-a-password/
  • http://www.postgresql.org/docs/9.2/static/pgcrypto.html
  • https://github.com/ircmaxell/password_compat


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Опции за аварийно възстановяване за PostgreSQL, разгърнат в хибриден облак

  2. Експортиране на PostgreSQL база данни с phpPgAdmin

  3. 2 начина за добавяне на водещи нули в PostgreSQL

  4. Как да направите динамични изявления, подготвени за postgres в PHP

  5. добър postgresql клиент за windows?