2012-06-08 9 views
6

Zum Beispiel mit blowfish gibt es so etwas wie:Ist es sicher, ein PHP crypt() - Ergebnis in der db zu speichern?

$2a$12$DEzG.CRsHpxpTOAHooQ.wuR6Xe9h6PxFPhOcOvf.lqDNw1TVYVnEO

, dass Informationen über den Typ alg von Hashing und es enthält das Salz enthält. Viele Ressourcen sagen, nur diesen Wert in der Datenbank zu speichern und es wird sicher sein. Aber könnte jemand nicht einfach eine gemeinsame Liste von Passwörtern gegen diese Werte testen, um einige davon zu knacken?

+0

Ist das nicht Ihre Datenbank sichern? – CompanyDroneFromSector7G

Antwort

7

Die Sicherheit des Passwort-Hashing kommt nicht von Informationen, die geheim sind. Sie haben das eigentliche Geheimnis bereits verworfen, nämlich das Passwort, das dem Hash-Wert zugrunde liegt. Der verbleibende Hash ist einfach eine Art Fingerabdruck dieser Originaldaten. Die Sicherheit ergibt sich daraus, dass es nicht möglich ist, die ursprünglichen Daten aus dem Hash abzuleiten. Die einzige Möglichkeit besteht darin, alle möglichen Passwörter auszuprobieren und zu sehen, welcher der gleiche Hash erzeugt. Die Sicherheit ergibt sich aus der Tatsache, dass dies rechnerisch sehr teuer ist und in einer nützlichen Zeitspanne wahrscheinlich nicht erfolgreich sein wird.

Das Salz wird nur eingeführt, um zu verhindern, dass jemand einen bereits vorberechneten Satz bekannter Hash-Passwörter verwendet und einen Angreifer dazu zwingt, alle möglichen Passwörter mit dem einzigartigen Salt neu aufzuzeichnen. Das Salz selbst ist nicht geheim, ebenso wenig wie der Hashalgorithmus.

Kurz gesagt: Ja, dieser Wert ist absolut sicher in einer Datenbank zu speichern.

4

Der von crypt() erzeugte Hash ist speziell für die Speicherung gedacht. Unabhängig davon, was Ihr Passwort-Hashing-Schema ist, wenn jemand Ihren Datenbankinhalt ergreift, wird er in der Lage sein, Ihre Passwörter brutal zu erzwingen, und Sie haben nicht die Möglichkeit, Passwort-Hashes überhaupt nicht zu speichern. Die Algorithmen, die von crypt() angewendet werden, werden speziell ausgewählt, weil sie viel Zeit benötigen, um den Hash zu berechnen; Dies ist nicht offensichtlich, wenn Sie nur ein Passwort testen, aber Brute-Forcing Tausende von Passwörtern wird unpraktisch langsam.

1

Aber konnte nicht jemand einfach eine gemeinsame Liste von Passwörtern gegen diese Werte testen, um einige von ihnen zu knacken?

Sie könnten immer tun, egal wie die Passwörter gespeichert sind. Die crypt-Funktion verhindert das nicht, aber sie wird es wirklich sehr langsam machen. Wenn ein Benutzer ein wirklich allgemeines Passwort verwendet (wie 123456), wird ihn kein Hash-Algorithmus in der Welt schützen.

Wenn Sie diese einfachen Kennwörter nicht zulassen und einen guten Hashalgorithmus (diese crypt() - Versorgung) verwenden, haben Sie Ihr Bestes getan, um die Kennwörter zu schützen.

0

Wenn jemand Zugriff auf Ihre Datenbank hat, hat er Zugriff auf das Salz, da Sie für jedes Benutzerkennwort ein anderes Salz verwenden sollten (das Sie wahrscheinlich in der Datenbank speichern würden).

Der Punkt des Salzes ist so, dass Regenbogen-Tabellen nicht funktionieren. Die Person müsste jede Kombination von Passwort + Salz erneut hashen, um das Passwort zu bestimmen. Sie verwenden ein anderes Salz für jedes Passwort, so dass er Millionen von Hashes für jedes Passwort generieren muss.

Einige weitere gute Informationen über Krypta finden sich hier: Why does PHP crypt() prepend the salt to the hash?