SHA1 vs md5 vs SHA256: welche für einen PHP-Login verwenden?

Ich mache eine PHP-Anmeldung, und ich versuche zu entscheiden, ob ich SHA1 oder Md5 oder SHA256 verwende, von denen ich in einem anderen stackoverflow-Artikel gelesen habe. Sind sie sicherer als andere? Brauche ich für SHA1 / 256 noch ein Salz?

Ist dies auch eine sichere Möglichkeit, das Passwort als Hash in mysql zu speichern?

function createSalt() { $string = md5(uniqid(rand(), true)); return substr($string, 0, 3); } $salt = createSalt(); $hash = sha1($salt . $hash); 

Solutions Collecting From Web of "SHA1 vs md5 vs SHA256: welche für einen PHP-Login verwenden?"

Weder. Sie sollten bcrypt . Die Hashes, die Sie erwähnen, sind alle so optimiert, dass sie schnell und einfach auf Hardware sind. Wenn Sie keine andere Wahl haben, sollten Sie zumindest ein langes Salz verwenden und mehrmals hashen.

Verwendung von bcrypt in PHP 5.5+

PHP 5.5 bietet neue functionen für das Passwort-Hashing . Dies ist der empfohlene Ansatz für die Kennwortspeicherung in modernen Webanwendungen.

 // Creating a hash $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); // If you omit the ['cost' => 12] part, it will default to 10 // Verifying the password against the stored hash if (password_verify($password, $hash)) { // Success! Log the user in here. } 

Wenn Sie eine ältere Version von PHP verwenden , sollten Sie ein Upgrade durchführen , aber bis dahin können Sie password_compat verwenden , um diese API verfügbar zu machen.

Bitte lassen Sie password_hash() das Salz für Sie generieren. Es verwendet ein [CSPRNG] (http: //

Zwei Vorbehalte von bcrypt

  1. Bcrypt wird jedes Kennwort, das länger als 72 Zeichen ist, stillschweigend abschneiden.
  2. Bcrypt wird nach allen NUL Zeichen abgeschnitten.

( Proof of Concept für beide Vorbehalte hier.)

Sie könnten versucht sein, den ersten Vorbehalt zu beheben, indem Sie Ihre Kennwörter vor dem Ausführen von bcrypt durch Vorabhashing korrigieren. Dies kann jedoch dazu führen, dass Ihre Anwendung mit dem Kopf voran in den zweiten hineinläuft.

Anstatt ein eigenes Schema zu schreiben, verwenden Sie eine vorhandene Bibliothek, die von Sicherheitsexperten geschrieben und / oder ausgewertet wurde.

  • Zend\Crypt (Teil von Zend Framework) bietet BcryptSha
  • PasswordLock ähnelt BcryptSha , verschlüsselt jedoch auch die bcrypt-Hashes mit einer authentifizierten Verschlüsselungsbibliothek .

TL; DR – Verwenden Sie bcrypt .

Ich denke, dass die Verwendung von md5 oder sha256 oder einem Hash, das für die Geschwindigkeit optimiert wurde, völlig in Ordnung ist und ich bin sehr neugierig darauf, andere Benutzer zu ignorieren. Hier sind meine Gründe

  1. Wenn Sie zulassen, dass Benutzer schwache Passwörter wie Gott, Liebe, Krieg, Frieden, dann unabhängig von der Verschlüsselung verwenden Sie immer noch den Benutzer das Passwort nicht den Hash eingeben und diese Passwörter werden oft zuerst verwendet, so wird dies nicht gehen etwas mit Verschlüsselung zu tun haben.

  2. Wenn Sie kein SSL verwenden oder kein Zertifikat haben, können Angreifer, die den Datenverkehr überwachen, das Passwort abrufen und alle Versuche, mit Javascript oder Ähnlichem zu verschlüsseln, sind clientseitig und können leicht geknackt und überwunden werden. Auch dies wird NICHT mit der Datenverschlüsselung auf der Serverseite zu tun haben.

  3. Brute-Force-Angriffe werden schwache Kennwörter ausnutzen, und wieder, weil Sie dem Benutzer erlauben, die Daten einzugeben, wenn Sie nicht die Einloggbeschränkung von 3 oder sogar ein wenig mehr haben, dann wird das Problem wieder NICHT mit Datenverschlüsselung zu tun haben.

  4. Wenn Ihre database kompromittiert wird, wurde wahrscheinlich alles kompromittiert, einschließlich Ihrer Hash-Techniken, egal wie kryptisch Sie es gemacht haben. Dies könnte wiederum ein verärgerter Mitarbeiter-XSS-Angriff oder eine SQL-Injection oder ein anderer Angriff sein, der nichts mit Ihrer Passwortverschlüsselung zu tun hat.

Ich glaube, dass Sie immer noch verschlüsseln sollten, aber das einzige, was ich sehen kann, ist, dass Leute, die bereits Zugriff auf die database haben oder irgendwie Zugang zu der database haben, nur das Passwort vorlesen können. Wenn jemand in der database nicht autorisiert ist, dann müssen Sie sich größere Sorgen machen. Deshalb wurde Sony aufgenommen, weil sie dachten, dass ein verschlüsseltes Passwort alles schützt, einschließlich Kreditkartennummern. Alles, was es tut, ist dieses eine Feld zu schützen.

Der einzige Vorteil, den ich bei komplexen Verschlüsselungen von Kennwörtern in einer database sehen kann, ist, dass Mitarbeiter oder andere Personen, die Zugriff auf die database haben, nicht nur die Kennwörter auslesen müssen. Also, wenn es ein kleines Projekt oder etwas ist, würde ich mich nicht viel um die Sicherheit auf der Serverseite kümmern, stattdessen würde ich mir mehr Sorgen machen über das Sichern von irgendetwas, das ein Client an den Server sendet, wie SQL-Injection, XSS-Attacken oder die Fülle anderer Wege könnte kompromittiert werden. Wenn jemand anderer Meinung ist, freue ich mich darauf, zu lesen, dass ein superverschlüsseltes Passwort ein Muss für den Client ist.

Der Grund, warum ich das klarstellen wollte, ist, dass die Leute zu oft glauben, ein verschlüsseltes Passwort bedeutet, dass sie sich keine Sorgen machen müssen, dass es kompromittiert wird, und dass sie aufhören, sich um die Website zu kümmern.

Wie Johannes Gorset darauf hingewiesen hat, erklärt der Beitrag von Thomas Ptacek von Matasano Security , warum einfache, universelle Hashing-functionen wie MD5, SHA1, SHA256 und SHA512 schlechte Passwort-Hashing-Optionen sind .

Warum? Sie sind zu schnell – Sie können mit einem modernen Computer mindestens 1.000.000 MD5-Hashes pro Sekunde berechnen, so dass Brute-Force-Angriffe gegen die meisten Passwörter möglich sind. Und das ist viel weniger als ein GPU-basierter Crack-Server-Cluster!

Das Salzen ohne Key-Stretching bedeutet nur, dass Sie den Rainbow-Tisch nicht vorberechnen können, Sie müssen ihn ad hoc für dieses spezielle Salz aufbauen. Aber es wird die Dinge nicht wirklich viel schwerer machen.

Benutzer @Will sagt:

Jeder redet darüber, als könnten sie über das Internet gehackt werden. Wie bereits erwähnt, macht es das Eingrenzen von Versuchen unmöglich, ein Passwort über das Internet zu knacken und hat nichts mit dem Hash zu tun.

Sie müssen nicht. Anscheinend verwendeten sie bei LinkedIn die übliche SQL-Injection-Schwachstelle , um die Login-DB-Tabelle zu erhalten und Millionen von Passwörtern offline zu knacken.

Dann geht er zurück zum Offline-Angriffsszenario:

Die Sicherheit kommt wirklich ins Spiel, wenn die gesamte database kompromittiert wird und ein Hacker dann 100 Millionen Passwortversuche pro Sekunde gegen den md5-Hash ausführen kann. SHA512 ist etwa 10.000 mal langsamer.

Nein, SHA512 ist nicht 10000 mal langsamer als MD5 – es dauert nur etwa doppelt so viel. Crypt / SHA512 dagegen ist ein ganz anderes Biest, das, wie sein BCrypt-Pendant, Key-Stretching durchführt , einen ganz anderen Hashwert mit eingebautem Zufalls-Salz erzeugt und alles zwischen 500 und 999999 mal so viel berechnen kann (Stretching ist einstellbar).

 SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21 

So ist die Wahl für PHP entweder Crypt / Blowfish (BCrypt), Crypt / SHA256 oder Crypt / SHA512. Oder zumindest Crypt / MD5 (PHK). Siehe http://www.php.net/manual/en/function.crypt.php

Verwenden Sie SHA256 . Es ist nicht perfekt, da SHA512 ideal für einen schnellen Hash wäre, aber außerhalb der Optionen ist es die definitive Wahl. Wie bei jeder Hashing-Technologie sollten Sie sicherstellen, dass der Hash für zusätzliche Sicherheit gesalzen wird.

Als zusätzliche Anmerkung, FRKT, zeig mir bitte, wo jemand leicht einen gesalzenen SHA256-Hash knacken kann? Ich bin wirklich sehr daran interessiert, dies zu sehen.

Wichtiges Edit:

Bitte verwenden Sie bcrypt als gehärteten Hash. Weitere Informationen finden Sie hier .


Beim Salzen bearbeiten:

Verwenden Sie eine Zufallszahl oder einen zufälligen Bytestrom usw. Sie können das eindeutige Feld des Datensatzes in Ihrer database auch als Salz verwenden. Auf diese Weise ist das Salz pro Benutzer unterschiedlich.

Was die Leute zu vermissen scheinen, ist, dass wenn der Hacker Zugriff auf die database hat, er wahrscheinlich auch Zugriff auf die PHP-Datei hat, die das Passwort hastet und wahrscheinlich nur ändern kann, um ihm alle erfolgreichen Benutzernamen-Passwort-Kombinationen zu senden. Wenn er keinen Zugriff auf das Webverzeichnis hat, kann er immer nur ein Passwort auswählen und es in die database schreiben. Mit anderen Worten, der Hash-Algorithmus ist nicht so wichtig wie die Systemsicherheit und die Begrenzung der Anmeldeversuche. Wenn Sie kein SSL verwenden, kann der Angreifer die Verbindung nur abhören, um die Informationen zu erhalten. Wenn Sie nicht benötigen, dass der Algorithmus lange braucht, um zu berechnen (für Ihre eigenen Zwecke), dann sollten SHA-256 oder SHA-512 mit einem benutzerspezifischen Salz ausreichen.

Als zusätzliche Sicherheitsmaßnahme richten Sie ein Skript (bash, batch, python, etc) oder Programm ein und geben Sie einen obskuren Namen ein und überprüfen Sie, ob sich die login.php geändert hat (Datum / Zeitstempel überprüfen) und senden Sie eine E-Mail wenn es so ist. Außerdem sollten Sie wahrscheinlich alle Anmeldeversuche mit Administratorrechten protokollieren und alle fehlgeschlagenen Versuche protokollieren, sich bei der database anzumelden und die Protokolle per E-Mail an Sie zu senden.

Jeder redet darüber, als könnten sie über das Internet gehackt werden. Wie bereits erwähnt, macht es das Eingrenzen von Versuchen unmöglich, ein Passwort über das Internet zu knacken und hat nichts mit dem Hash zu tun.

Das Salz ist ein Muss, aber die Komplexität oder mehrere Salze spielt keine Rolle. Jedes Salz allein verhindert, dass der Angreifer einen vorgefertigten Rainbow-Table verwendet. Ein eindeutiges Salt pro Benutzer verhindert, dass der Angreifer eine neue Rainbow-Tabelle erstellt, die er für die gesamte Nutzerbasis verwendet.

Die Sicherheit kommt wirklich ins Spiel, wenn die gesamte database kompromittiert wird und ein Hacker dann 100 Millionen Passwortversuche pro Sekunde gegen den md5-Hash ausführen kann. SHA512 ist etwa 10.000 mal langsamer. Ein komplexes Passwort mit der heutigen Macht könnte noch 100 Jahre brauchen, um mit md5 brachial zu werden und mit SHA512 10.000 mal länger. Die Salze stoppen eine Bruteforce überhaupt nicht, da sie immer bekannt sein müssen. Wenn der Angreifer Ihre database heruntergeladen hat, war er wahrscheinlich sowieso in Ihrem System.

MD5, SHA1 und SHA256 sind Nachrichtenauszüge, keine Passwort-Hash-functionen.

Gegenwärtig ist PBKDF2 der einzige Standard (wie von NIST sanktioniert) die Passwort-Hashing- oder Schlüsselableitungsfunktion. Andere sinnvolle Alternativen, wenn ein Standard nicht benötigt wird, sind bcrypt , der neuere scrypt und der noch neuere argon2i . Wikipedia hat Seiten für diese functionen:

Der Wechsel von MD5 zu SHA1 oder SHA512 wird die Sicherheit der Konstruktion nicht verbessern. Die Berechnung eines SHA256- oder SHA512-Hash ist sehr schnell. Ein Angreifer mit gewöhnlicher Hardware könnte immer noch Dutzende Millionen (mit einer einzigen CPU) oder sogar Milliarden (mit einer einzigen GPU) Hashes pro Sekunde ausprobieren. Gute Password-Hashing-functionen beinhalten einen Arbeitsfaktor, um Angreifer zu verlangsamen.

Hier sind einige Vorschläge für PHP-Programmierer: Lesen Sie die PHP-FAQ: http://php.net/manual/en/faq.passwords.php dann verwenden Sie eine der folgenden:

MD5 ist wegen Kollisionsproblemen schlecht – zwei verschiedene Passwörter erzeugen möglicherweise den gleichen MD-5.

Sha-1 wäre sicher genug dafür. Der Grund, warum Sie die gesalzene sha-1-Version des Passworts speichern, besteht darin, dass Sie den Benutzer nicht in der Lage halten, ein password in der Datei zu speichern, das möglicherweise mit den Servern anderer Leute verwendet wird. Ansonsten, welchen Unterschied macht es?

Wenn der Hacker Ihre gesamte unverschlüsselte database stiehlt, dann ist das einzige, was ein gesalzenes Hash-Passwort bewirkt, dass er den Benutzer nicht für zukünftige Anmeldungen darstellt – der Hacker hat bereits die Daten.

Was nützt es dem Angreifer, den Hash-Wert zu haben, wenn das, was Ihr Benutzer eingibt, ein einfaches Passwort ist?

Und selbst wenn der Hacker mit Zukunftstechnologie eine Million sha-1 Schlüssel pro Sekunde für einen Brute-Force-Angriff generieren könnte, würde Ihr Server eine Million Logons pro Sekunde verarbeiten, damit der Hacker seine Schlüssel testen kann? Das ist, wenn Sie den Hacker versuchen, sich mit dem gesalzenen sha-1 anstelle eines Passworts wie bei einer normalen Anmeldung anzumelden.

Am besten ist es, schlechte Anmeldeversuche auf eine vernünftige Zahl von 25 zu begrenzen und dann den Benutzer für eine oder zwei Minuten auszustrahlen. Und wenn die kumulativen Bady-Anmeldeversuche innerhalb von 24 Stunden 250 erreichen, schließen Sie den Kontozugriff und senden Sie eine E-Mail an den Eigentümer.

Hier ist der Vergleich zwischen MD5 und SHA1. Sie können sich eine klare Vorstellung davon machen, welches besser ist.

Bildbeschreibung hier eingeben

Nehmen wir den nächsten Punkt an: Die Hacker stehlen unsere database einschließlich der Benutzer und des Passworts (verschlüsselt). Und die Hacker haben einen gefälschten Account mit einem Passwort erstellt, das sie kennen.

MD5 ist schwach, weil seine kurze und populäre und praktisch jede Hash-Generation ohne Passwort schwach ist von einem Wörterbuchangriff. Aber..

Lassen Sie uns also sagen, dass wir immer noch MD5 mit einem SALT verwenden. Die Hacker kennen das SALT nicht, aber sie kennen das Passwort eines bestimmten Benutzers. So können sie testen: ????? 12345 Wo ist 12345 das Passwort und ????? ist das Salz. Die Hacker können früher oder später das SALT erraten.

Wenn wir jedoch ein MD5 + SALT verwendet haben und MD5 angewendet haben, gibt es keine Möglichkeit, die Informationen wiederherzustellen. Wie auch immer, ich wiederhole, MD5 ist immer noch kurz.

Nehmen wir zum Beispiel an, dass mein Passwort 12345 ist. Das SALT ist BILLCLINTON

md5: 827ccb0eea8a706c4c34a16891f84e7b

md5 mit dem Hash: 56adb0f19ac0fb50194c312d49b15378

mD5 mit dem Hash über MD5: 28a03c0bc950decdd9ee362907d1798a Ich habe versucht, diesen Online-Service zu verwenden, und ich fand niemanden, der es knacken konnte. Und es ist nur MD5! (mag sein wie heute wird es knackbar sein, weil ich die md5 online generiert habe)

Wenn Sie übertreiben wollen, dann ist SHA256 mehr als genug, wenn es mit einem Salz und zweimal angewendet wird.

tldr MD5 (HASH + MD5 (Passwort)) = ok, aber kurz, SHA256 ist mehr als genug.