sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik wachtwoorden hashen in postgresql?

Het is een tijdje geleden dat ik deze vraag heb gesteld en ik ben nu veel meer vertrouwd met de cryptografische theorie, dus hier is de modernere benadering:

Redenen

  • Gebruik geen md5. Gebruik geen enkele cyclus van sha-family snelle hashes. Snelle hashes helpen aanvallers, dus dat wil je niet.
  • Gebruik in plaats daarvan een resource-intensieve hash, zoals bcrypt. Bcrypt is in de tijd getest en kan worden opgeschaald om toekomstbestendig te zijn.
  • Doe geen moeite om je eigen zout te rollen, je zou je eigen veiligheid of draagbaarheid kunnen verknoeien, vertrouw op gen_salt() om zijn geweldige, unieke zouten op zichzelf te genereren.
  • Wees in het algemeen geen idioot, probeer niet je eigen cryptovaluta van eigen bodem te schrijven, gebruik gewoon wat slimme mensen hebben gegeven.

Debian/Ubuntu-installatiepakketten

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)

Activeer crypt() en bcrypt in postgresql in uw 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

Gebruik crypt() en gen_salt() in zoekopdrachten

Vergelijk :pass naar bestaande hash met:

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

Maak een hash van :password met een geweldig willekeurig zout:

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

Van-in-Php bcrypt-hashing heeft enigszins de voorkeur

Er zijn password_* functies in php 5.5 en hoger die triviaal eenvoudige wachtwoord-hashing met bcrypt mogelijk maken (hoogste tijd!), en er is een bibliotheek met achterwaartse compatibiliteit voor versies daaronder. Over het algemeen die hashing valt terug op het inpakken van een linux-systeemaanroep voor een lager CPU-gebruik, hoewel je er misschien voor wilt zorgen dat het op je server is geïnstalleerd. Zie:https://github.com/ircmaxell/password_compat (vereist php 5.3.7+)

Pas op met loggen

Merk op dat met pg_crypto de wachtwoorden in platte tekst zijn tijdens de verzending van de browser, naar php, naar de database. Dit betekent dat ze in leesbare tekst kunnen worden gelogd van query's als u niet voorzichtig bent met uw databaselogboeken. bijv. het hebben van een postgresql trage query-log kan het wachtwoord van een lopende login-query opvangen en loggen.

Samenvattend

Gebruik php bcrypt als je kunt, het zal de tijd verkorten dat het wachtwoord niet gehasht blijft. Probeer ervoor te zorgen dat uw Linux-systeem bcrypt heeft geïnstalleerd in zijn crypt() dus dat is performant. Upgrade naar ten minste php 5.3.7+ wordt ten zeerste aanbevolen, aangezien de implementatie van php enigszins buggy is van php 5.3.0 naar 5.3.6.9, en ten onrechte terugvalt op de kapotte DES zonder waarschuwing in php 5.2.9 en lager.

Als je in-postgres hashing wilt/nodig hebt, is het installeren van bcrypt de beste keuze, aangezien de standaard geïnstalleerde hashes oud en kapot zijn (md5, enz.).

Hier zijn referenties voor meer informatie over het onderwerp:

  • 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


  1. Inleiding tot wachtstatistieken

  2. MS-Access-basisklasse en afgeleide objecten

  3. Databaseproxy-failovertijden vergelijken - ProxySQL, MaxScale en HAProxy

  4. Slaapstand tijdstempel met tijdzone