Nein, es ist nicht möglich, eine Hash-Funktion wie MD5 umzukehren: Angesichts des Ausgabe-Hash-Werts ist es unmöglich, die Eingabenachricht zu finden, wenn nicht genügend Informationen über die Eingabenachricht bekannt sind.
Die Entschlüsselung ist keine Funktion, die für eine Hash-Funktion definiert ist. Verschlüsselung und Entschlüsselung sind Funktionen einer Verschlüsselung wie AES im CBC-Modus; Hash-Funktionen werden weder verschlüsselt noch entschlüsselt . Hash-Funktionen werden verwendet, um eine Eingabenachricht zu verarbeiten. Wie der Name schon sagt kein Reverse - Algorithmus möglich ist , durch Design .
MD5 wurde als kryptografisch sichere Einweg- Hash-Funktion entwickelt. Es ist jetzt einfach, Kollisionen für MD5 zu generieren - selbst wenn ein großer Teil der Eingabenachricht vorbestimmt ist. MD5 ist also offiziell defekt und MD5 sollte nicht mehr als kryptografisch sicherer Hash betrachtet werden. Es ist jedoch immer noch unmöglich, eine Eingabenachricht zu finden, die zu einem Hashwert führt: Finden Sie X, wenn nur H (X) bekannt ist (und X keine vorberechnete Struktur mit mindestens einem 128-Byte-Block vorberechneter Daten hat). . Es sind keine Pre-Image-Angriffe gegen MD5 bekannt.
Im Allgemeinen ist es auch möglich, Passwörter mithilfe von Brute-Force- oder (erweiterten) Wörterbuchangriffen zu erraten, Datenbanken zu vergleichen oder zu versuchen, Passwort-Hashes in sogenannten Regenbogentabellen zu finden. Wenn eine Übereinstimmung gefunden wird, ist rechnerisch sicher, dass die Eingabe gefunden wurde. Hash-Funktionen sind auch gegen Kollisionsangriffe sicher: Finden X'
, dass H(X') = H(X)
gegeben H(X)
. Wenn also ein X
gefunden wird, ist es rechnerisch sicher, dass es tatsächlich die Eingabenachricht war. Andernfalls hätten Sie doch einen Kollisionsangriff durchgeführt. Regenbogentabellen können verwendet werden, um die Angriffe zu beschleunigen, und es gibt spezielle Internetressourcen, mit denen Sie ein Kennwort für einen bestimmten Hash finden können.
Es ist natürlich möglich, den Hash-Wert erneutH(X)
zu verwenden, um Kennwörter zu überprüfen, die auf anderen Systemen generiert wurden. Das empfangende System muss lediglich das Ergebnis einer deterministischen Funktion speichern F
, die H(X)
als Eingabe verwendet wird. Wann X
wird dem System dann gegeben H(X)
und F
kann daher neu berechnet und die Ergebnisse verglichen werden. Mit anderen Worten, es ist nicht erforderlich , den Hash-Wert zu entschlüsseln, um nur zu überprüfen, ob ein Kennwort korrekt ist, und Sie können den Hash weiterhin als einen anderen Wert speichern.
Anstelle von MD5 ist es wichtig, stattdessen einen Kennwort-Hash oder PBKDF (kennwortbasierte Schlüsselableitungsfunktion) zu verwenden. Eine solche Funktion gibt an, wie ein Salz zusammen mit einem Hash verwendet wird. Auf diese Weise werden keine identischen Hashes für identische Kennwörter (von anderen Benutzern oder in anderen Datenbanken) generiert. Passwort-Hashes erlauben aus diesem Grund auch nicht die Verwendung von Regenbogentabellen, solange das Salz groß genug und richtig zufällig ist.
Kennwort-Hashes enthalten auch einen Arbeitsfaktor (manchmal mithilfe einer Iterationszahl konfiguriert ), der Angriffe, die versuchen, das Kennwort anhand des Salt- und Hash-Werts zu finden, erheblich verlangsamen kann. Dies ist wichtig, da die Datenbank mit Salzen und Hashwerten gestohlen werden kann. Schließlich kann der Passwort-Hash auch speicherintensiv sein, so dass eine erhebliche Menge an Speicher erforderlich ist, um den Hash zu berechnen. Dies macht es unmöglich, spezielle Hardware (GPUs, ASICs, FPGAs usw.) zu verwenden, damit ein Angreifer die Suche beschleunigen kann. Für einen Kennwort-Hash stehen möglicherweise auch andere Eingaben oder Konfigurationsoptionen zur Verfügung, z. B. ein Pfeffer oder der Umfang der Parallelisierung.
Es wird jedoch weiterhin jedem erlaubt, ein angegebenes Passwort zu überprüfen, H(X)
selbst wenn H(X)
es sich um einen Passwort-Hash handelt. Passwort-Hashes sind immer noch deterministisch. Wenn also jemand alle Eingaben und den Hash-Algorithmus selbst kennt, X
können H(X)
die Ergebnisse berechnet und erneut verglichen werden.
Häufig verwendete Passwort-Hashes sind bcrypt , scrypt und PBKDF2 . Es gibt auch Argon2 in verschiedenen Formen, das der Gewinner des relativ neuen Passwort-Hashing-Wettbewerbs ist. Hier auf CrackStation ist ein guter Blog-Beitrag darüber, wie man Passwortsicherheit richtig macht.
Es ist möglich, dass Gegner die Hash-Berechnung nicht durchführen können, um sicherzustellen, dass ein Kennwort korrekt ist. Hierzu kann ein Pfeffer als Eingabe für den Passwort-Hash verwendet werden. Alternativ kann der Hash-Wert natürlich mit einer Verschlüsselung wie AES und einer Betriebsart wie CBC oder GCM verschlüsselt werden. Dies erfordert jedoch die Speicherung eines Geheimnisses / Schlüssels unabhängig und mit höheren Zugriffsanforderungen als der Passwort-Hash.