Minęło trochę czasu, odkąd zadałem to pytanie, a teraz jestem znacznie bardziej zaznajomiony z teorią kryptograficzną, więc oto bardziej nowoczesne podejście:
Rozumowanie
- Nie używaj md5. Nie używaj jednego cyklu szybkich skrótów sha-family. Szybkie skróty pomagają atakującym, więc tego nie chcesz.
- Zamiast tego użyj skrótu wymagającego dużej ilości zasobów, takiego jak bcrypt. Bcrypt jest testowany czasowo i skaluje się, aby był odporny na przyszłość.
- Nie zawracaj sobie głowy toczeniem własnej soli, możesz schrzanić własne bezpieczeństwo lub przenośność, polegaj na gen_salt(), aby samodzielnie wygenerować niesamowite, niepowtarzalne do każdego zastosowania sole.
- Ogólnie rzecz biorąc, nie bądź idiotą, nie próbuj pisać własnego krypto, po prostu użyj tego, co zapewnili mądrzy ludzie.
Pakiety instalacyjne Debiana/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)
Aktywuj crypt() i bcrypt w postgresql w swojej bazie danych
// 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
Użyj crypt() i gen_salt() w zapytaniach
Porównaj :pass z istniejącym hashem z:
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
Utwórz hash :hasło ze świetną losową solą:
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
Hashowanie bcrypt From-in-Php jest nieco preferowane
Istnieje password_*
funkcje w php 5.5 i nowszych, które pozwalają na trywialnie proste hashowanie haseł za pomocą bcrypt (czasem!), i istnieje biblioteka kompatybilności wstecznej dla wersji niższych. Ogólnie to haszowanie i tak sprowadza się do pakowania wywołań systemowych linux w celu zmniejszenia zużycia procesora, chociaż możesz chcieć upewnić się, że jest zainstalowany na swoim serwerze. Zobacz:https://github.com/ircmaxell/password_compat (wymaga php 5.3.7+)
Uważaj na logowanie
Zauważ, że w przypadku pg_crypto hasła są w postaci zwykłego tekstu podczas transmisji z przeglądarki, do php, do bazy danych. Oznacza to, że można je logować w postaci zwykłego tekstu z zapytań, jeśli nie jesteś ostrożny z dziennikami bazy danych. np. posiadanie dziennika powolnych zapytań postgresql może przechwycić i zarejestrować hasło z trwającego zapytania logowania.
Podsumowanie
Użyj php bcrypt, jeśli możesz, skróci to czas, w którym hasło pozostaje niezaszyfrowane. Upewnij się, że twój system linux ma zainstalowany bcrypt w jego crypt()
więc to jest wydajne. Uaktualnienie do co najmniej 5.3.7+ jest wysoce zalecane, ponieważ implementacja php jest nieco błędna z php 5.3.0 do 5.3.6.9 i niewłaściwie wraca do zepsutego DES
bez ostrzeżenia w php 5.2.9 i niższych.
Jeśli chcesz/potrzebujesz hashowania w postgresie, najlepszym rozwiązaniem jest zainstalowanie bcrypt, ponieważ domyślne zainstalowane hashy są stare i uszkodzone (md5 itp.).
Oto odnośniki, aby dowiedzieć się więcej na ten temat:
- http://codahale.com/jak-bezpiecznie-przechowywać-hasło/
- http://www.postgresql.org/docs/9.2/static/pgcrypto.html
- https://github.com/ircmaxell/password_compat