sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu hashovat hesla v postgresql?

Je to už nějakou dobu, co jsem tuto otázku položil, a nyní jsem mnohem více obeznámen s kryptografickou teorií, takže zde je modernější přístup:

Důvod

  • Nepoužívejte md5. Nepoužívejte jediný cyklus rychlých hashů rodiny sha. Rychlé haše pomáhají útočníkům, takže to nechcete.
  • Namísto toho použijte hash náročný na zdroje, jako je bcrypt. Bcrypt je testován časem a škálován tak, aby byl odolný vůči budoucnosti.
  • Neobtěžujte se válením své vlastní soli, můžete si pokazit vlastní zabezpečení nebo přenositelnost, spolehněte se na gen_salt() a vygenerujte své úžasné soli, které jsou jedinečné pro každé použití.
  • Obecně, nebuďte idiot, nesnažte se napsat vlastní domácí kryptoměnu, používejte jen to, co chytří lidé poskytli.

Instalační balíčky 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)

Aktivujte crypt() a bcrypt v postgresql ve vaší databázi

// 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

V dotazech použijte crypt() a gen_salt()

Porovnejte :pass s existujícím hashem s:

select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)

Vytvořte hash :password s velkou náhodnou solí:

insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)

O něco vhodnější je hašování bcrypt z PHP

Existují password_* funkce v php 5.5 a vyšší, které umožňují triviálně jednoduché hašování hesel pomocí bcrypt (už je čas!), a pro verze pod tím existuje knihovna zpětné kompatibility. Obecně toto hashování se v každém případě vrací k zabalení systémového volání linuxu pro nižší využití CPU, i když možná budete chtít zajistit, aby bylo nainstalováno na vašem serveru. Viz:https://github.com/ircmaxell/password_compat (vyžaduje php 5.3.7+)

Dejte si pozor na protokolování

Všimněte si, že u pg_crypto jsou hesla během přenosu z prohlížeče do php do databáze v prostém textu. To znamená, že mohou být přihlášeni v prostém textu z dotazů, pokud si nedáváte pozor na databázové protokoly. např. mít protokol pomalého dotazu postgresql by mohl zachytit a zaznamenat heslo z probíhajícího přihlašovacího dotazu.

V souhrnu

Pokud můžete, použijte php bcrypt, zkrátí to dobu, po kterou heslo zůstane nehašované. Zkuste se ujistit, že váš linuxový systém má nainstalovaný bcrypt v crypt() tak to je výkonné. Upgrade alespoň na php 5.3.7+ se důrazně doporučuje, protože implementace php je mírně chybná z php 5.3.0 na 5.3.6.9 a nevhodně se vrací k nefunkčnímu DES bez varování v php 5.2.9 a nižších.

Pokud chcete/potřebujete in-postgres hash, instalace bcrypt je správná cesta, protože výchozí nainstalované hashe jsou staré a nefunkční (md5 atd.).

Zde jsou odkazy na další čtení na toto téma:

  • 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. Jak vybrat z MySQL, kde je název tabulky Variabilní

  2. Obnovte výpis na vzdáleném počítači

  3. Oznámení obecné dostupnosti SQL Secure 4.0

  4. Jak zálohovat nebo vytvořit novou tabulku ze Stávající tabulky SQL Serveru na SQL Serveru - SQL Server / Výukový program TSQL, část 105