Im Allgemeinen müssen Sie nicht mehr als einen Hashalgorithmus verwenden.
Was Sie tun müssen, ist:
Verwenden Sie Salt: Salt wird nicht nur verwendet, um Ihr Passwort sicherer zu machen , sondern auch, um Regenbogenangriffe zu vermeiden. Auf diese Weise wird es jemandem schwerer fallen, den Hash für die in Ihrem System gespeicherten Passwörter vorab zu berechnen.
Verwenden Sie mehrere Interaktionen: Anstatt nur SHA (Passwort + Salt) auszuführen, müssen Sie SHA (SHA (SHA (SHA (... SHA (Passwort + Salt))))) ausführen. Oder auf andere Weise darstellen:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
Und schließlich wählen Sie eine gute Hashing-Funktion. SHA, MD5 usw. sind nicht gut, weil sie zu schnell sind . Da Sie Hash zum Schutz verwenden möchten, sollten Sie langsamere Hashes verwenden. Schauen Sie sich zum Beispiel Bcrypt , PBKDF2 oder Scrypt an.
Bearbeiten : Lassen Sie uns nach den Beobachtungen versuchen, einige Punkte zu sehen (Entschuldigung, lange Erklärungen, um zum Ende zu gelangen, da dies anderen helfen könnte, nach ähnlichen Antworten zu suchen):
Wenn Ihr System sicher ist und niemand jemals Zugriff auf das gespeicherte Kennwort erhalten wird, benötigen Sie keinen Hash. Das Passwort wäre geheim, niemand würde es bekommen.
Aber niemand kann versichern, dass die Datenbank mit den Passwörtern gestohlen wird. Stehlen Sie die Datenbank, haben Sie alle Passwörter. Ok, Ihr System und Ihre Firma werden alle Konsequenzen davon haben. Wir könnten also versuchen, dieses Passwortleck zu vermeiden.
HINWEIS, dass wir uns in diesem Punkt keine Sorgen über Online-Angriffe machen. Für einen Online-Angriff ist es die beste Lösung, nach schlechten Passwörtern langsamer zu werden, das Konto nach einigen Versuchen zu sperren usw. Dabei spielt es keine Rolle, wie Sie Ihr Passwort verschlüsseln, hashen, speichern usw. Bei einem Online-Angriff werden die Kennworteingaben verlangsamt .
Also zurück zum don't let them take my plain passwords
Problem. Die Antwort ist einfach: Speichern Sie sie nicht als Klartext. OK habe es.
Wie vermeide ich das?
Verschlüsseln Sie das Passwort (?). Aber wie Sie wissen, können Sie es, wenn Sie es verschlüsseln, wieder entschlüsseln, wenn Sie den richtigen Schlüssel haben. Und Sie werden am Ende das Problem haben, wo Sie den Schlüssel verstecken müssen. Hum, nicht gut, da sie Ihre Datenbank haben, können sie Ihren Schlüssel bekommen. Ok, lass es uns nicht benutzen.
Also ein anderer Ansatz: Lassen Sie uns das Passwort in etwas anderes verwandeln, das nicht rückgängig gemacht werden kann, und es speichern. Um zu überprüfen, ob das angegebene Passwort korrekt ist, führen wir den gleichen Vorgang erneut durch und prüfen, ob die beiden transformierten Werte übereinstimmen. Wenn sie übereinstimmen = wurde das richtige Passwort angegeben.
Ok, soweit so gut. Verwenden wir einen MD5-Hash im Passwort. Aber ... wenn jemand unseren gespeicherten Hash-Wert des Passworts hat, kann er viel Computerleistung haben, um den MD5-Hash jedes möglichen Passworts (Brute Force) zu berechnen, so dass er das ursprüngliche Passwort finden kann. Oder, schlimmstenfalls, er kann alle MD5 aus allen Zeichenkombinationen speichern und das Passwort leicht finden. Also mache viele Iterationen, die HASH (HASH (HASH ())) Sache, um es schwieriger zu machen, weil es mehr Zeit braucht.
Aber auch das kann umgangen werden, der Regenbogentisch wurde genau dafür geschaffen, diesen Schutz zu beschleunigen.
Lassen Sie uns etwas Salz darüber geben. Auf diese Weise wird das Salz bei jeder Wechselwirkung erneut verwendet. Wenn Sie versuchen, Ihre Passwörter anzugreifen, müssen Sie die Regenbogentabelle generieren, wobei berücksichtigt wird, dass das Salz jedes Mal hinzugefügt wird. Und wenn er diese Regenbogentabelle erzeugt, muss er, da sie mit einem Salz erzeugt wurde, erneut mit dem anderen Salz rechnen, sodass er für jedes Passwort (= jedes Salz) etwas Zeit aufwenden muss. Salt fügt dem Passwort keine "größere Komplexität" hinzu. Der Angreifer verliert nur Zeit beim Generieren der Regenbogentabelle. Wenn Sie für jedes Passwort ein Salt verwenden, ist die Tabelle von einem Salt für ein anderes Passwort unbrauchbar.
Und die Verwendung von mehr als einem Hash hat hier geholfen? Nein. Die Person, die einen bestimmten Regenbogenangriff erzeugt, kann diesen ohnehin mit einem oder mehreren Hashes erzeugen.
Die Verwendung von mehr als einem Hash kann zu einem Problem führen: Es ist so sicher wie der schwächste Hash, den Sie verwenden. Wenn jemand in einem Hash-Algorithmus Kollisionen findet, wird dieser Hash zu jedem Zeitpunkt des Iterationsprozesses ausgenutzt, um das Kennwort zu knacken. Wenn Sie also mehr Hash-Algorithmen verwenden, erhalten Sie nichts. Es ist besser, nur eine gute Algo auszuwählen. und benutze es. Und wenn Sie jemals hören, dass es kaputt ist, überlegen Sie, wie Sie es in Ihrer Anwendung ändern werden.
Und warum sollten Sie bcrypt oder so etwas verwenden (Sie sagen, Sie verwenden es): weil der Angreifer mehr Zeit damit verbringen muss, die Tabellen zu generieren. Aus diesem Grund hilft es nicht, MD5 + wait (3 Sekunden) zu verwenden: Der Angriff ist ohnehin offline, sodass der Angreifer die Tabellen ohne die Verzögerung von 3 Sekunden erstellen kann.