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