PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak mogę haszować hasła w postgresql?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Importowanie pliku .sql w systemie Windows do postgresql

  2. „uwierzytelnianie hasła nie powiodło się dla postgres użytkownika”

  3. Jak wykorzystać typ danych Postgres JSONB z JPA?

  4. Oblicz godziny pracy między 2 datami w PostgreSQL

  5. Używanie złączeń do łączenia danych z różnych tabel w PostgreSQL