PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich Passwörter in Postgresql hashen?

Es ist schon eine Weile her, dass ich diese Frage gestellt habe, und ich bin jetzt viel besser mit der kryptografischen Theorie vertraut, also hier ist der modernere Ansatz:

Argumentation

  • Verwenden Sie nicht md5. Verwenden Sie keinen einzelnen Zyklus von Quick-Hashes der Sha-Familie. Schnelle Hashes helfen Angreifern, also wollen Sie das nicht.
  • Verwenden Sie stattdessen einen ressourcenintensiven Hash wie bcrypt. Bcrypt ist zeiterprobt und skaliert, um zukunftssicher zu sein.
  • Kümmern Sie sich nicht darum, Ihr eigenes Salt zu rollen, Sie könnten Ihre eigene Sicherheit oder Portabilität vermasseln, verlassen Sie sich auf gen_salt(), um seine fantastischen, einzigartigen Salts selbst zu generieren.
  • Seien Sie im Allgemeinen kein Idiot, versuchen Sie nicht, Ihre eigene hausgemachte Krypto zu schreiben, verwenden Sie einfach das, was kluge Leute bereitgestellt haben.

Debian/Ubuntu-Installationspakete

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)

Aktiviere crypt() und bcrypt in postgresql in deiner Datenbank

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

Verwenden Sie crypt() und gen_salt() in Abfragen

Vergleichen Sie :pass mit vorhandenem Hash mit:

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

Erstellen Sie einen Hash von :password mit einem großartigen zufälligen Salt:

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

Von-in-Php-bcrypt-Hashing ist etwas vorzuziehen

Es gibt password_* Funktionen in PHP 5.5 und höher, die ein trivial einfaches Passwort-Hashing mit bcrypt ermöglichen (wird langsam!), und es gibt eine Abwärtskompatibilitätsbibliothek für Versionen darunter. Allgemein Dieses Hashing greift ohnehin auf das Umschließen eines Linux-Systemaufrufs zurück, um die CPU-Auslastung zu verringern, obwohl Sie möglicherweise sicherstellen möchten, dass es auf Ihrem Server installiert ist. Siehe:https://github.com/ircmaxell/password_compat (erfordert PHP 5.3.7+)

Seien Sie vorsichtig mit der Protokollierung

Beachten Sie, dass bei pg_crypto die Passwörter während der gesamten Übertragung vom Browser über PHP zur Datenbank im Klartext vorliegen. Das bedeutet, dass sie im Klartext protokolliert werden können von Abfragen, wenn Sie mit Ihren Datenbankprotokollen nicht vorsichtig sind. z.B. ein langsames postgresql-Abfrageprotokoll zu haben, könnte das Passwort einer laufenden Anmeldeabfrage abfangen und protokollieren.

Zusammenfassung

Verwenden Sie php bcrypt, wenn Sie können, es wird die Zeit verkürzen, in der das Passwort nicht gehasht bleibt. Versuchen Sie sicherzustellen, dass Ihr Linux-System bcrypt in seinem crypt() installiert hat das ist also performant. Ein Upgrade auf mindestens PHP 5.3.7+ wird dringend empfohlen, da die Implementierung von PHP von PHP 5.3.0 bis 5.3.6.9 leicht fehlerhaft ist und unangemessenerweise auf das kaputte DES zurückgreift ohne Warnung in PHP 5.2.9 und niedriger.

Wenn Sie In-Postgres-Hashing wollen/benötigen, ist die Installation von bcrypt der richtige Weg, da die standardmäßig installierten Hashes alt und kaputt sind (md5 usw.).

Hier sind Referenzen für weitere Lektüre zu diesem Thema:

  • 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