Измина известно време, откакто зададох този въпрос и сега съм много по-запознат с криптографската теория, така че ето по-модерния подход:
Разсъждение
- Не използвайте 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