2010-12-20 1 views
15

Ich suche Beratung, wie sicher Passwörter in MySQL mit PHP speichern.Was sind die besten Praktiken zum Verschlüsseln von Passwörtern in MySql mit PhP?

Mit Blick auf die Einschränkungen von PHP selbst, möchte ich mehr über das Salzen, Hashing und Verschlüsseln dieser bösen Jungs wissen.

Offensichtlich werden die Leute weiterhin schwache Passwörter verwenden, wenn sie nicht gezwungen werden, etwas anderes zu tun, aber es ist, wie ich sie speichere, was mir wichtig ist. Die Passwörter meines Benutzers sind für mich viel wichtiger als die Datenbank selbst, und deshalb möchte ich sie so aufbewahren, dass sie für jeden Script-Kiddie, der das Gegenteil versucht, mühsam und eintönig sein wird. Natürlich kann mit gebührender Sorgfalt fast alles besiegt werden, aber ich hätte nichts dagegen, dies besonders störend zu machen.

Es gibt zwei Szenarien, die wir betrachten.

  1. Der Kiddie hat eine vollständige Kopie der Datenbank.
  2. Der Kiddie hat eine vollständige Kopie der PHP verwendet, um das Passwort und die Datenbank herzustellen.

Alle und alle Ratschläge zu diesem Thema wird gnädig geschätzt.

+1

Der beste Weg ist die Verwendung von Passwörtern überhaupt nicht. Siehe InstaPaper. –

+0

Sind Ihre Benutzer lokal oder über das Internet? –

+0

Sowohl lokal als auch Internet. Ich ziehe es vor, nicht auf Internetressourcen angewiesen zu sein, aber ich denke, das könnte eine Option sein (z. B. das Salz von einem Drittanbieter.) – Matt

Antwort

17

Verwenden Sie bcrypt. Wenn jemand die Benutzertabelle Ihrer Datenbank hat, kann er Brute-Force-/Rainbow-Tabellen/etc nach Herzenslust verwenden. Sogar mit Salz, wenn Sie MD5 oder einen anderen schnellen Hashalgorithmus verwenden (die übrigens nicht dafür gedacht sind, dieses Problem zu lösen); es ist nur eine Frage der Zeit, bis es geknackt werden kann.

Jeder bekannte und weit verbreitete Hashing-Algorithmus wird diesen grundlegenden "Fehler" haben (wenn Sie es so nennen können; es ist wirklich per Definition). Der Unterschied ist, dass bcryptlangsam wie Melasse bei der Durchführung der Hash-Operation ist, wodurch ein Brute-Force-Angriff viel weniger effektiv.

Für eine absolut gute Diskussion über die Vorzüge von bcrypt, die Gefahren anderer Ansätze und die Schwierigkeit der Passwort-Sicherheit im Allgemeinen, lesen Sie this thread. Es hat viele Kommentare von vielen Menschen, die viel besser über diese Dinge informiert sind als ich, und es sollte Ihnen hoffentlich helfen, mehr von den Problemen zu verstehen.

+0

Ja, bcrypt hat den Vorteil, dass Sie den Hash-Prozess beliebig langsam machen können. Keine große Sache auf Ihrem Server, wenn es eine Viertelstunde dauert, ein Passwort zu hashen.Aber es ist wichtig für den Kiddie, wenn er nur vier Hashes pro Sekunde berechnen kann, anstatt Tausende. – eaj

+0

+1 für die Wiederholung der Website. –

+0

@Time Machine Lol, ich dachte mir, ich würde es rausbringen, während ich den Rest meiner Antwort eintippte :) – Donut

1

Wenn Ihre Benutzer über das Internet sind, wäre OpenId eine Ihrer besten Optionen.

Wenn Ihre Benutzer in Ihrem Netzwerk sind, können Sie Integrated Security ausführen?

Mit anderen Worten .. speichern Sie nicht ihre Passwörter.

+0

Sie können über das Internet sein, und sie können auch zeitweise lokal sein.Aus diesem Grund kann ich nicht auf OpenID verlassen.Danke, obwohl! – Matt

1

Regel „gesalzen“ Passwörter (wie bei bcrypt) bedeuten, dass das Passwort nicht selbst gespeichert, sondern nur so etwas wie

salt 
    hash(salt with password appended) 

Wenn nun die Kiddie hat Ihre Datenbank (und natürlich die Code - dort hat keinen Sinn, den Code geheim zu halten), er/sie kann nur Passwörter erraten, den gesalzenen Hash berechnen und vergleichen. Wenn die Hash-Funktion teuer ist (wie bcrypt), dann ist auch das Raten teuer.

1

Es ist einfach

store(sha256("somesalt" + password)); 

Und niemand in der Lage, es rückgängig zu machen :)

Siehe auch: https://stackoverflow.com/questions/3897434/password-security-sha1-sha256-or-sha512

+0

Angenommen, sie haben die Datenbank/php sie sind sehr bewusst Brute, die ihren Weg daran vorbei treiben, ist einfach eine Frage des Hinzufügens des Salzes vor dem Passwort. – Matt

+0

Wir werden Wörterbuchangriffe nicht verhindern. –

+0

@MAtt: Das Salz muss bekannt sein, sonst können Passwörter nicht sein v gereinigt. Brute Force ist theoretisch möglich, aber nicht in der Praxis. @Time Machine: Wie so? Dafür ist das Salz da. Wenn es ausreichend lang und einzigartig ist, wird es kein Wörterbuch haben. –

8

Angenommen, Sie Benutzername und Passwort als Authentifizierungs-Token verwenden Sie sicher speichern können um sicherzustellen, dass die Daten nicht kompromittiert werden können.

  • Benutzername (unverschlüsselt)
  • Salz (zufällige Zeichenfolge)
  • gesalzene Hash (sha1 (Benutzername + Salz + Passwort))

das Schema verwenden, Ein Angreifer kann rainbow tables nicht gegen Sie verwenden, und die Kennwörter können auf keine (angemessene) Weise wiederhergestellt werden. (Das heißt, solange Ihr Angreifer nicht die Regierung ist)

Obwohl der Angreifer über die Salz- und Hash-Paare verfügt, ist es nicht möglich, Rainbow-Tabellen zu verwenden, da alle möglichen Hashes sowieso berechnet werden müssen Salz, das ihnen gegeben wurde, also ist es ein brandneues Brute-Force-Angriff für jeden Benutzer.

Auch mit dem Quellcode und Angreifer wird nicht in der Lage sein, die Kennwörter zu erhalten, weil die Stärke/Sicherheit im Hash-Algorithmus, nicht in Ihrem Code ist.

Kombinieren Sie dies mit bcrypt nach Donuts Antwort und Sie sind wirklich ziemlich sicher. Das heißt:

  • Benutzername (unverschlüsselt)
  • Salz (zufällige Zeichenfolge)
  • gesalzene Hash (bcrypt (Benutzername + Salz + Passwort))
+0

+1: Mit einem Vorbehalt. "auf jeden Fall" .. nicht genau. Sie können immer noch Rainbow-Tabellen erstellen und Kollisionen finden. Allerdings benötigen Sie für jedes Salz eine. Was, obwohl möglich, einfach nicht durchführbar ist (daher die +1). Wenn Sie die NSA oder eine andere Regierungsbehörde sind, sind alle Wetten ungültig. – NotMe

3

Taking Beratung von here, für zusätzlichen Spaß können Sie auch Ihr Salz dynamisch ändern. Verwenden Sie beispielsweise unterschiedliche Salze für Benutzernamen unterschiedlicher Länge, verwenden Sie das Registrierungsdatum des Benutzers als Salz. Dies macht es möglich, dass, selbst wenn jemand in Ihre Datenbank gelangt, diese den Hash nicht einfach neu erzeugen können, sondern eine Hash-Tabelle für jedes von Ihnen verwendete Salz berechnen müssen.

+0

Dies ist eine hervorragende Ergänzung zu dem Thema. Es wurde in einer Sicherheitsklasse diskutiert, die ich gemacht habe. Eigentlich müssen Sie das Salz nur jedes Mal um 1 erhöhen, wenn Sie einen Benutzer hinzufügen. Solange das Salz für jeden Benutzer anders ist, müssten Rainbow-Tabellen für jeden Benutzer neu berechnet werden, was einen Brute-Force-Angriff extrem ärgerlich macht. +1 –

+1

Jeder, der über das Speichern von Kennwörtern in einer Datenbank nachdenkt, sollte diesen Blogpost lesen – niteria