Come posso cancellare le password in postgresql?

Ho bisogno di hash alcune password con sale su postgresql, e non sono stato in grado di trovare alcuna documentazione pertinente su come ottenere quello fatto.

Quindi, come posso cancellare le password (con alcuni sali) in postgresql?

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

Ragionamento

  • Non usare md5. Non utilizzare un singolo ciclo di hash quick family. Gli hash veloci aiutano gli aggressori, quindi non lo vuoi.
  • Utilizzare invece un hash ad alta intensità di risorse, come bcrypt. Bcrypt è testato nel tempo e si adatta alle esigenze future.
  • Non preoccuparti di arrotolare il tuo sale, potresti rovinare la tua sicurezza o la tua portabilità, affidarti a gen_salt () per generare i suoi straordinari sali unici da usare per conto proprio.
  • In generale, non essere un idiota, non provare a scrivere la tua cripta nostrana, usa solo quello 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 a 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 grande sale casuale:

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

L’hashing From-in-php bcrypt è leggermente preferibile

Ci sono funzioni password_* in php 5.5 e versioni successive che consentono un hashing di password banalmente semplice con bcrypt (sul tempo!), E c’è una libreria di compatibilità a ritroso per le versioni al di sotto di quella. In genere, l’ hashing ricade sul wrapping di una chiamata di sistema linux per un utilizzo inferiore della CPU, anche se si consiglia di assicurarsi che sia installato sul 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 tutte durante la trasmissione dal browser, a php, al database. Ciò significa che possono essere registrati in chiaro dalle query se non si presta attenzione ai registri del database. ad es. avere un log delle query lento 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 non trattata. Cerca di assicurarti che il tuo sistema Linux abbia bcrypt installato nella sua crypt() modo che sia performante. L’aggiornamento ad almeno php 5.3.7+ è altamente raccomandato poiché l’implementazione di php è un po ‘buggata da php 5.3.0 a 5.3.6.9, e cade in modo inappropriato nel DES rotto senza preavviso in php 5.2.9 o inferiore.

Se si desidera / ha bisogno di hashing in-postgres, installare bcrypt è la strada da percorrere, poiché gli hash predefiniti installati sono vecchi e non funzionanti (md5, ecc.).

Ecco i riferimenti per maggiori letture sull’argomento:

Un’applicazione deve cancellare le sue password utilizzando la funzione di derivazione della chiave come bcrypt o pbkdf2. Ecco ulteriori informazioni sull’archiviazione sicura delle password .

… ma a volte hai ancora bisogno di funzioni crittografiche in un database.

È ansible utilizzare pgcrypto per ottenere l’accesso a sha256, membro della famiglia sha2. Tieni presente che sha0, sha1 md4 e md5 sono molto rotti e non dovrebbero mai essere utilizzati per gli hash delle password.

Quello che segue è un ottimo metodo per le password di hashing:

 digest("salt"||"password"||primary_key, "sha256") 

Il sale dovrebbe essere un grande valore generato casualmente. Questo sale deve essere protetto, perché gli hash non possono essere spezzati fino a quando il sale non viene recuperato. Se si memorizza il sale nel database, è ansible ottenerlo insieme all’hash della password utilizzando SQL injection. La concatenazione della chiave primaria viene utilizzata per impedire a 2 persone di avere lo stesso hash della password anche se hanno la stessa password. Ovviamente questo sistema potrebbe essere migliorato, ma questo è molto meglio della maggior parte dei sistemi che ho visto.

Generalmente è meglio fare l’hashing nella tua applicazione prima che colpisca il database. Ciò è dovuto al fatto che i querys possono essere visualizzati nei registri e, se il server del database era di proprietà, potevano abilitare la registrazione per ottenere password di testo chiare.

Esempi e documentazione su: http://www.postgresql.org/docs/8.3/static/pgcrypto.html

 UPDATE ... SET pswhash = crypt('new password', gen_salt('md5')); SELECT pswhash = crypt('entered password', pswhash) FROM ... ;