PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso eseguire l'hashing delle password in postgresql?

È passato un po' di tempo da quando ho posto questa domanda e ora ho molta più familiarità con la teoria crittografica, quindi ecco l'approccio più moderno:

Ragionamento

  • Non utilizzare md5. Non utilizzare un singolo ciclo di hash rapidi della famiglia sha. Gli hash rapidi aiutano gli aggressori, quindi non lo vuoi.
  • Utilizza invece un hash ad alta intensità di risorse, come bcrypt. Bcrypt è testato nel tempo e si espande per essere a prova di futuro.
  • Non preoccuparti di rotolare il tuo sale, potresti rovinare la tua sicurezza o portabilità, affidati a gen_salt() per generare da solo i suoi fantastici sali unici per ogni uso.
  • In generale, non essere un idiota, non provare a scrivere la tua criptovaluta nostrana, usa solo ciò che le persone intelligenti hanno fornito.

Pacchetti di installazione 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)

Attiva crypt() e bcrypt in postgresql nel tuo database

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

Usa crypt() e gen_salt() nelle query

Confronta :passa all'hash esistente con:

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

Crea un hash di :password con un ottimo sale casuale:

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

L'hashing bcrypt From-in-Php è leggermente preferibile

Ci sono password_* funzioni in php 5.5 e versioni successive che consentono l'hashing delle password banalmente semplice con bcrypt (era ora!) E c'è una libreria di compatibilità con le versioni precedenti per le versioni precedenti. Generalmente quell'hashing ricade comunque sul wrapping di una chiamata di sistema Linux per un utilizzo inferiore della CPU, anche se potresti voler assicurarti che sia installato sul tuo server. Vedi:https://github.com/ircmaxell/password_compat (richiede php 5.3.7+)

Fai attenzione alla registrazione

Si noti che con pg_crypto, le password sono in chiaro durante tutta la trasmissione dal browser, a php, al database. Ciò significa che possono essere registrati in chiaro dalle query se non stai attento con i log del database. per esempio. avere un log di query lente postgresql potrebbe catturare e registrare la password da una query di accesso in corso.

In sintesi

Usa php bcrypt se puoi, ridurrà il tempo in cui la password rimane senza hash. Cerca di assicurarti che il tuo sistema Linux abbia bcrypt installato nel suo crypt() quindi è performante. L'aggiornamento ad almeno php 5.3.7+ è altamente raccomandato poiché l'implementazione di php è leggermente buggata da php 5.3.0 a 5.3.6.9 e ricade in modo inappropriato al DES non funzionante senza preavviso in php 5.2.9 e precedenti.

Se vuoi/hai bisogno dell'hashing in-postgres, l'installazione di bcrypt è la strada da percorrere, poiché gli hash installati di default sono vecchi e non funzionanti (md5, ecc.).

Ecco i riferimenti per ulteriori letture sull'argomento:

  • 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