it-swarm.com.de

SHA1 vs MD5 vs SHA256: welche für a verwendet werden PHP Anmeldung?

Ich mache ein PHP-Login und versuche zu entscheiden, ob ich SHA1 oder Md5 oder SHA256 verwenden soll, über die ich in einem anderen Stackoverflow-Artikel gelesen habe. Sind einige von ihnen sicherer als andere? Kann ich für SHA1/256 immer noch ein Salz verwenden? 

Ist dies eine sichere Methode, um das Kennwort als Hash in mysql zu speichern?

function createSalt()
{
    $string = md5(uniqid(Rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();

$hash = sha1($salt . $hash);
131
Tony Stark

Weder. Sie sollten bcrypt verwenden. Alle Hashes, die Sie erwähnen, sind so optimiert, dass sie schnell und einfach für die Hardware sind. Wenn Sie keine andere Wahl haben, stellen Sie sicher, dass Sie mehrmals ein langes Salt und Re-Hash verwenden.

Verwendung von bcrypt in PHP 5.5 und höher

PHP 5.5 bietet neue Funktionen 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 Sie sollten ein Upgrade wirklich durchführen } verwenden, können Sie diese API jedoch erst mit password_compat verfügbar machen.

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

Zwei Vorbehalte von bcrypt

  1. Bcrypt schneidet unbemerkt jedes Kennwort ab, das länger als 72 Zeichen ist.
  2. Bcrypt wird nach NUL-Zeichen abgeschnitten.

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

Sie könnten versucht sein, die erste Einschränkung durch vor dem Hashing der Passwörter durch bcrypt zu beheben,} _, aber Ihre Anwendung kann dazu führen, dass Ihre Anwendung mit dem ersten Schritt voran geht. 

Verwenden Sie statt eines eigenen Schemas eine vorhandene Bibliothek, die von Sicherheitsexperten geschrieben und/oder ausgewertet wurde.

TL; DR - Use bcrypt .

104
Johannes Gorset

Ich denke, md5 oder sha256 oder jeder für Geschwindigkeit optimierte Hash ist vollkommen in Ordnung und bin sehr neugierig darauf, dass alle anderen Benutzer rebuttle haben. Hier sind meine Gründe

  1. Wenn Sie Benutzern erlauben, schwache Passwörter wie Gott, Liebe, Krieg, Frieden zu verwenden, dann werden Sie unabhängig von der Verschlüsselung immer noch dem Benutzer die Eingabe des Passworts und nicht des Hashes gestatten. Diese Passwörter werden häufig zuerst verwendet, daher ist dies NICHT hat etwas mit Verschlüsselung zu tun.

  2. Wenn Sie kein SSL verwenden oder über kein Zertifikat verfügen, können Angreifer, die den Datenverkehr überwachen, das Kennwort abrufen, und alle Versuche, mit Javascript oder Ähnlichem zu verschlüsseln, sind clientseitig und können leicht geknackt und überwunden werden. Auch hier handelt es sich um NICHT, die auf der Serverseite mit der Datenverschlüsselung zu tun haben.

  3. Brute-Force-Angriffe nutzen schwache Passwörter und wiederum, da Sie dem Benutzer die Eingabe der Daten gestatten, wenn Sie keine Anmeldebeschränkung von 3 oder sogar etwas mehr haben, dann wird das Problem NICHT etwas zu tun haben mit Datenverschlüsselung.

  4. Wenn Ihre Datenbank kompromittiert wird, wurde höchstwahrscheinlich alles kompromittiert, einschließlich Ihrer Hashtechniken, egal wie kryptisch Sie es gemacht haben. Dies könnte wiederum ein missmutiger XSS-Angriff der Mitarbeiter oder SQL-Injektion oder ein anderer Angriff sein, der nichts mit Ihrer Kennwortverschlüsselung zu tun hat.

Ich glaube, Sie sollten immer noch verschlüsseln, aber das einzige, was ich sehen kann, ist, dass Personen, die bereits Zugriff auf die Datenbank haben oder sich irgendwie Zugang dazu verschafft haben, nur das Kennwort vorlesen können. Wenn es sich um jemanden handelt, der nicht für die Datenbank autorisiert ist, dann müssen Sie sich um größere Probleme kümmern, weshalb sich Sony dafür sorgt, dass ein verschlüsseltes Kennwort alles geschützt hat, einschließlich der Kreditkartennummern. Es schützt nur ein einziges Feld.

Der einzige reine Vorteil, den ich bei komplexen Verschlüsselungen von Passwörtern in einer Datenbank sehen kann, besteht darin, Mitarbeiter oder andere Personen, die Zugriff auf die Datenbank haben, davon abzuhalten, die Passwörter nur vorzulesen. Wenn es sich also um ein kleines Projekt handelt, muss ich mich nicht um die Sicherheit auf der Serverseite sorgen, sondern um alles, was ein Client an den Server sendet, wie SQL-Injektion, XSS-Angriffe oder die Vielzahl anderer Möglichkeiten könnte kompromittiert werden. Wenn jemand anderer Meinung ist, freue ich mich darauf zu lesen, dass ein super verschlüsseltes Passwort von der Client-Seite ein Muss ist.

Der Grund, warum ich versuchen wollte, das klar zu stellen, ist, dass die Leute zu oft glauben, dass ein verschlüsseltes Passwort bedeutet, dass sie sich keine Sorgen machen müssen, dass das Passwort gefährdet wird, und dass sie sich nicht mehr um die Sicherung der Website kümmern müssen.

25
Roger Johnson

Wie Johannes Gorset hervorhob, erklärt der Beitrag von Thomas Ptacek von Matasano Security , warum einfache, allgemeine Hashfunktionen 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-Hash pro Sekunde pro Kern berechnen, so dass rohe Gewalt gegen die meisten Passwörter möglich ist. Und das ist viel weniger als ein GPU-basierter Crack-Server-Cluster!

Salting ohne Key-Stretching bedeutet nur, dass Sie die Rainbow-Tabelle nicht vorberechnen können. Sie müssen sie ad-hoc für dieses bestimmte Salt erstellen. Aber es wird nicht wirklich schwieriger.

Benutzer @Will sagt:

Jeder redet darüber, als könnte er über die .__ gehackt werden. Internet. Begrenzungsversuche machen es, wie bereits gesagt, unmöglich, ein Passwort über das Internet knacken und hat nichts mit der .__ zu tun. hash.

Sie brauchen es nicht. Anscheinend benutzten sie in dem Fall von LinkedIn die allgemeine SQL Injection-Schwachstelle , um die Login-DB-Tabelle abzurufen und Millionen von Passwörtern offline zu knacken.

Dann geht er zurück zum Offline-Angriffsszenario:

Die Sicherheit kommt wirklich zum Tragen, wenn die gesamte Datenbank .__ ist. und ein Hacker kann dann ein Kennwort von 100 Millionen Versuche pro Sekunde gegen den MD5-Hash. SHA512 ist etwa 10.000 mal Langsamer.

Nein, SHA512 ist nicht 10000-mal langsamer als MD5 - es dauert nur etwa doppelt so viel. Auf der anderen Seite ist Crypt/SHA512 ein ganz anderes Tier, das wie sein BCrypt-Gegenstück Key Stretching ausführt und einen ganz anderen Hash mit einem zufälligen Salt-Set erzeugt und dies mitnehmen wird Alles zwischen 500 und 999999 mal so viel zu berechnen (Dehnen ist einstellbar).

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

Die Wahl für PHP ist daher entweder Crypt/Blowfish (BCrypt), Crypt/SHA256 oder Crypt/SHA512. Oder zumindest Crypt/MD5 (PHK). Siehe www.php.net/manual/de/function.crypt.php

14
LexLythius

Verwenden Sie SHA256. Es ist nicht perfekt, da SHA512 ideal für einen schnellen Hash wäre, aber aus den Optionen heraus ist es die endgültige Wahl. Achten Sie bei jeder Hash-Technologie darauf, den Hash für zusätzliche Sicherheit zu salzen.

Als zusätzliche Notiz, FRKT, bitte zeigen Sie mir, wo jemand leicht einen gesalzenen SHA256-Hash knacken kann. Ich bin wirklich sehr daran interessiert, das zu sehen.

Wichtige Bearbeitung:

Für den nächsten Schritt verwenden Sie bitte bcrypt als gehärteten Hash. Weitere Informationen finden Sie hier .


Bearbeiten auf Salting:

Verwenden Sie eine Zufallszahl oder einen zufälligen Byte-Stream usw. Sie können auch das eindeutige Feld des Datensatzes in Ihrer Datenbank als Salt-Wert verwenden. Auf diese Weise unterscheidet sich der Salt-Wert pro Benutzer.

13
Kyle Rozendo

Was vermisst wird, ist, dass der Hacker, wenn er Zugriff auf die Datenbank hat, wahrscheinlich auch Zugriff auf die PHP-Datei hat, die das Kennwort hasst, und diese möglicherweise ändern kann, um ihm alle erfolgreichen Kennwortkombinationen für Benutzernamen zu senden. Wenn er keinen Zugriff auf das Web-Verzeichnis hat, kann er immer nur einen Passwort-Hash auswählen und in die Datenbank schreiben. Mit anderen Worten, der Hash-Algorithmus ist nicht so wichtig wie die Systemsicherheit. Wenn Sie die Anmeldeversuche einschränken, auch wenn Sie kein SSL verwenden, kann der Angreifer die Verbindung einfach abhören, um die Informationen abzurufen. Wenn Sie nicht brauchen, dass der Algorithmus (für Ihre eigenen Zwecke) lange Berechnungen benötigt, dann sollte SHA-256 oder SHA-512 mit einem benutzerspezifischen Salt ausreichen.

Als zusätzliche Sicherheitsmaßnahme richten Sie ein Skript (bash, batch, python usw.) oder ein Programm ein, geben Sie ihm einen unklaren Namen und lassen Sie es überprüfen, ob sich login.php geändert hat (überprüfen Sie Datum/Zeitstempel) und senden Sie eine E-Mail wenn es so ist Außerdem sollten Sie wahrscheinlich alle Anmeldeversuche mit Administratorrechten und alle fehlgeschlagenen Anmeldeversuche in der Datenbank und die E-Mail-Protokolle protokollieren.

4

Jeder spricht darüber, als ob er über das Internet gehackt werden könnte. Wie bereits erwähnt, machen Begrenzungsversuche es unmöglich, ein Kennwort über das Internet zu knacken, und haben nichts mit dem Hash zu tun.

Das Salz ist ein Muss, aber die Komplexität oder mehrere Salze spielen keine Rolle. Jedes Salz allein hindert den Angreifer daran, einen vorgefertigten Rainbow-Tisch zu verwenden. Ein eindeutiger Salt pro Benutzer hindert den Angreifer daran, eine neue Rainbow-Tabelle zu erstellen, die für Ihre gesamte Benutzerbasis verwendet werden kann.

Die Sicherheit kommt wirklich zum Tragen, wenn die gesamte Datenbank gefährdet ist und ein Hacker 100 Millionen Kennwortversuche pro Sekunde gegen den md5-Hash ausführen kann. SHA512 ist etwa 10.000 Mal langsamer. Ein komplexes Passwort mit der heutigen Leistung könnte noch 100 Jahre dauern, um mit md5 zu bruteforce und mit SHA512 10.000 Mal so lange. Die Salze stoppen eine Bruteforce nicht, da sie immer bekannt sein müssen. Wenn der Angreifer Ihre Datenbank heruntergeladen hat, war er wahrscheinlich sowieso in Ihrem System.

3
Will

MD5 ist aufgrund von Kollisionsproblemen schlecht - zwei unterschiedliche Passwörter generieren möglicherweise dasselbe MD-5.

Sha-1 wäre dafür reichlich sicher. Der Grund, warum Sie die gesalzene sha-1-Version des Kennworts speichern, besteht darin, dass der Swerver das Kennwort des Benutzers nicht in einer Datei speichert, die möglicherweise von den Servern anderer Benutzer verwendet wird. Welchen Unterschied macht es sonst? 

Wenn der Hacker Ihre gesamte unverschlüsselte Datenbank stiehlt, verhindert ein gehashtes gesalzenes Kennwort nur, dass er den Benutzer für zukünftige Anmeldungen als Person ausbilden kann - der Hacker hat bereits die Daten.

Was nützt es dem Angreifer, den Hashwert zu verwenden, wenn der Benutzer ein reines Passwort eingibt? 

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 Anmeldungen pro Sekunde ausführen, damit der Hacker seine Schlüssel testen kann? Das ist, wenn Sie den Hacker versuchen, sich mit dem gesalzenen sha-1 anstelle eines Kennworts wie bei einer normalen Anmeldung anzumelden.

Die beste Wette besteht darin, schlechte Anmeldeversuche auf eine vernünftige Anzahl zu beschränken - beispielsweise auf 25 - und dann den Benutzer für ein oder zwei Minuten auszufahren. Und wenn die kumulativen Bady-Anmeldeversuche innerhalb von 24 Stunden 250 Treffer erzielen, schließen Sie den Zugang zum Konto und senden Sie eine E-Mail an den Eigentümer.

1
Brad Jensen

Verwenden Sie argon2i. Die Passwort-Hashing-Funktion argon2 hat den Password Hashing-Wettbewerb gewonnen.

Andere sinnvolle Optionen, wenn argon2 nicht verfügbar ist, sind scrypt, bcrypt und PBKDF2. Wikipedia hat Seiten für diese Funktionen:

MD5, SHA1 und SHA256 sind Message Digests, keine Passwort-Hashing-Funktionen. Sie sind für diesen Zweck nicht geeignet.

Ein Wechsel von MD5 zu SHA1 oder SHA512 verbessert die Sicherheit der Konstruktion nicht so sehr. Das Berechnen eines SHA256- oder SHA512-Hash ist sehr schnell. Ein Angreifer mit gewöhnlicher Hardware kann immer noch Dutzende Millionen (mit einer einzelnen CPU) oder sogar Milliarden (mit einer einzelnen GPU) an Hashes pro Sekunde versuchen. Gute Passwort-Hashing-Funktionen enthalten einen Arbeitsfaktor, um Wörterbuchangriffe zu verlangsamen.

Hier ist ein Vorschlag für Programmierer von PHP: Lesen Sie die PHP FAQ und verwenden Sie password_hash () .

1
Erwan Legrand

Hier ist der Vergleich zwischen MD5 und SHA1. Sie können eine klare Vorstellung davon bekommen, welche besser ist.

 enter image description here

1

Nehmen wir den nächsten Punkt an: Die Hacker stehlen unsere Datenbank einschließlich der Benutzer und des Passworts (verschlüsselt). Und die Hacker erstellten ein falsches Konto mit einem ihnen bekannten Passwort.

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

Nehmen wir an, wir verwenden immer noch MD5 mit einem SALT. Die Hacker kennen das SALT nicht, aber sie kennen das Passwort eines bestimmten Benutzers. So können sie testen: ????? 12345 wobei 12345 das Kennwort ist und ????? ist das Salz. Die Hacker können früher oder später das SALT erraten.

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

Angenommen, mein Passwort lautet beispielsweise: 12345. Das SALT lautet BILLCLINTON

md5: 827ccb0eea8a706c4c34a16891f84e7b

md5 mit dem Hash: 56adb0f19ac0fb50194c312d49b15378

mD5 mit dem Hash über MD5: 28a03c0bc950decdd9ee362907d1798a Ich habe versucht, diesen Onlinedienst zu verwenden, und ich habe keinen gefunden, der ihn knacken konnte. Und es ist nur MD5! (kann sein wie heute, es wird knackbar sein, weil ich das MD5 online generiert habe)

Wenn Sie zu viel machen wollen, dann ist SHA256 mehr als genug, wenn es mit einem Salz und zweimal aufgetragen wird.

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

0
magallanes

Eine md5-Verschlüsselung ist eine der schlechtesten, da Sie den Code umdrehen müssen und er bereits entschlüsselt ist. Ich würde dir den SHA256 empfehlen. Ich programmiere etwas länger und habe gute Erfahrungen gemacht. Unten wäre auch eine Verschlüsselung.

password_hash() example using Argon2i

<?php
echo 'Argon2i hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>
The above example will output something similar to:

Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
0
Lars Gross