it-swarm.com.de

Wie kann ich in postgresql Passwörter hashen?

Ich muss einige Passwörter mit Salt auf postgresql hacken, und ich konnte keine relevante Dokumentation finden, wie das erledigt werden kann.

Wie kann ich Passwörter (mit einigen Salzen) in postgresql hashen?

46
Kzqai

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

Argumentation

  • Verwenden Sie nicht MD5. Verwenden Sie keinen einzigen Zyklus von schnellen Hashes der sha-Familie. Schnelle Hashes helfen Angreifern, also wollen Sie das nicht.
  • Verwenden Sie stattdessen einen ressourcenintensiven Hash wie bcrypt. Bcrypt ist erprobt und skaliert, um zukunftssicher zu sein.
  • Machen Sie sich nicht die Mühe, Ihr eigenes Salz zu rollen, Sie könnten Ihre eigene Sicherheit oder Portabilität vermasseln. Verlassen Sie sich auf gen_salt (), um ein fantastisches Salz zu generieren, das für jede Anwendung einzigartig ist.
  • Seien Sie im Allgemeinen kein Idiot, versuchen Sie nicht, Ihre eigene Krypto zu schreiben, sondern verwenden Sie nur das, was clevere 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: Weitergabe an vorhandenen 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 zufälligen Salt:

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

Von-in-PHP-Verschlüsselung ist etwas vorzuziehen

Es gibt password_* - Funktionen in PHP 5.5 und höher, die ein einfaches Hashing von Passwörtern mit bcrypt ermöglichen (ungefähr zeitlich!), Und es gibt eine Abwärtskompatibilitätsbibliothek für Versionen darunter. Generell dass Hashing auf das Einbinden eines Linux-Systemaufrufs für eine geringere CPU-Auslastung zurückgreift, obwohl Sie möglicherweise sicherstellen möchten, dass er auf Ihrem Server installiert ist. Siehe: https://github.com/ircmaxell/password_compat (benötigt PHP 5.3.7+)

Achten Sie auf die Protokollierung

Beachten Sie, dass bei pg_crypto die Passwörter während der Übertragung vom Browser zu PHP zur Datenbank im Klartext vorliegen. Dies bedeutet, dass sie im Klartext aus Abfragen protokolliert werden können, wenn Sie mit Ihren Datenbankprotokollen nicht vorsichtig sind. z.B. Ein langsames postgresql-Abfrageprotokoll kann das Kennwort einer laufenden Anmeldeabfrage abfangen und protokollieren.

In Summe

Verwenden Sie PHP Bcrypt, wenn Sie können, es wird die Zeit verkürzen, die das Kennwort nicht gehasht bleibt. Stellen Sie sicher, dass auf Ihrem Linux-System bcrypt in crypt() installiert ist, damit die Leistung stimmt. Ein Upgrade auf mindestens PHP 5.3.7+ wird dringend empfohlen, da die PHP-Implementierung von PHP 5.3.0 bis 5.3.6.9 leicht fehlerhaft ist und unangemessenerweise auf das fehlerhafte DES zurückgreift, ohne dass in PHP 5.2.9 und niedriger gewarnt wird .

Wenn Sie in-postgres-Hashing benötigen, ist die Installation von bcrypt der richtige Weg, da die standardmäßig installierten Hashes alt und defekt sind (md5 usw.).

Hier finden Sie Referenzen zum Thema:

75
Kzqai

Eine Anwendung sollte ihre Passwörter mit einer Schlüsselableitungsfunktion wie bcrypt oder pbkdf2 hashen. Weitere Informationen zum sicheren Speichern von Passwörtern .

... aber manchmal brauchen Sie noch kryptografische Funktionen in einer Datenbank.

Sie können pgcrypto verwenden, um Zugriff auf sha256 zu erhalten, das Mitglied der sha2-Familie ist. Denken Sie daran, sha0, sha1, md4 und md5 sind sehr kaputt und sollten niemals für Passwort-Hashes verwendet werden.

Das Folgende ist eine gute Methode zum Hashing von Passwörtern:

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

Das Salz sollte ein großer zufällig generierter Wert sein. Dieses Salz sollte geschützt werden, da die Hashes erst dann aufgebrochen werden können, wenn das Salz gewonnen wurde. Wenn Sie das Salz in der Datenbank speichern, kann es zusammen mit dem Kennwort-Hash mithilfe von SQL Injection abgerufen werden. Durch die Verkettung des Primärschlüssels wird verhindert, dass zwei Personen denselben Kennwort-Hash haben, auch wenn sie dasselbe Kennwort haben. Natürlich könnte dieses System verbessert werden, aber das ist viel besser als die meisten Systeme, die ich gesehen habe.

Im Allgemeinen ist es am besten, in Ihrer Anwendung einen Hash durchzuführen, bevor sie in die Datenbank gelangt. Dies liegt daran, dass Abfragen in Protokollen angezeigt werden können. Wenn der Datenbankserver Eigentümer ist, können sie die Protokollierung aktivieren, um Klartextkennwörter abzurufen.

16
rook

Beispiele und Dokumentation unter: 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 ... ;
8
Matej Puntar