Ein "sicherer" Hash ist ein Hash, von dem angenommen wird, dass er auf formelhafte und reproduzierbare Weise nur schwer zu "fälschen" ist, wenn die zur Erstellung des Hashs verwendete Nachricht im Voraus bekannt ist. Da diese Informationen im Allgemeinen geheim sind und daher ein Hash erforderlich ist, ist dies eine gute Eigenschaft einer Hash-Funktion, die zur Verwendung bei der Authentifizierung vorgesehen ist.
Ein Hash wird im Allgemeinen als "sicher" betrachtet, wenn bei einer gegebenen Nachricht M, einem Hash-Funktions-Hash () und einem Hash-Wert H, der durch Hash (M) mit einer Länge in Bits L erzeugt wird, keines der Folgenden in weniger als ausgeführt werden kann O (2 L ) Zeit:
- Mit Hash () und H erhält man M. (Preimage Resistance)
- Erzeugt bei gegebenem Hash () und M ein anderes M 2, so dass Hash (M 2 ) == H. (schwacher Kollisionswiderstand)
- Wenn hash () gegeben ist, produziere M 1 und M 2 so, dass hash (M 1 ) == hash (M 2 ) ist. (starke Kollisionsfestigkeit)
Zusätzlich muss ein "sicherer" Hash eine Hash-Länge L von 2 L habenDies ist keine praktikable Anzahl von Schritten, die ein Computer ausführen kann, wenn die aktuelle Hardware vorhanden ist. Ein 32-Bit-Ganzzahl-Hash kann nur 2,1 Milliarden Werte haben. Während ein Preimage-Angriff (das Auffinden einer Nachricht, die ein bestimmtes Hash-H erzeugt) eine Weile dauern würde, ist er für viele Computer nicht durchführbar, insbesondere für diejenigen in den Händen von Regierungsbehörden, die mit Code-Breaking gechartert sind. Darüber hinaus würde ein Algorithmus, der zufällige Nachrichten und deren Hashes erstellt und speichert, mit einer Wahrscheinlichkeit von 50% versuchen, mit jeder neuen Nachricht einen doppelten Hash zu finden, nachdem er nur 77.000 Nachrichten ausprobiert hat duplizieren nach nur 110.000. Selbst 64-Bit-Hashes haben noch eine 50-prozentige Chance zu kollidieren, nachdem sie nur etwa 5 Milliarden Werte ausprobiert haben. Das ist die Macht des Geburtstagsangriffs auf kleine Haschischarten. Im Gegensatz,Dezillionszahlen (1,5 * 10 34 ).
Die meisten zeigten Angriffe auf kryptographischen Hashes haben Kollision Angriffe gewesen und haben die Fähigkeit gezeigt , zu erzeugen Nachrichten in weniger als 2 kollidiert L Zeit ( die meisten haben noch exponentiell Zeit gewesen, aber den Exponenten um die Hälfte reduziert ist eine signifikante Reduktion der Komplexität , da es macht ein 256-Bit-Hash, der so einfach zu lösen ist wie ein 128-Bit-Hash, ein 128-Bit-Hash, der so einfach zu lösen ist wie ein 64-Bit-Hash usw.).
Neben der geringen Hash-Größe können folgende Faktoren einen Hash nachweislich unsicher machen:
Geringer Arbeitsaufwand - Ein Hash, der für die Verwendung durch eine Hash-Tabelle oder für andere Zwecke vom Typ "Prüfsumme" entwickelt wurde, ist normalerweise so konzipiert, dass er rechnerisch kostengünstig ist. Das macht einen Brute-Force-Angriff so viel einfacher.
"Sticky State" - Die Hash-Funktion ist anfällig für Eingabemuster, bei denen sich der aktuelle Hash-Wert aller Eingaben bei einem bestimmten zusätzlichen Eingabebyte nicht ändert. Wenn Sie den Status "Sticky State" haben, können Kollisionen leicht gefunden werden, da es trivial ist, andere Nachrichten mit demselben Hash zu generieren, indem Sie Eingabebytes anhängen, die den Hash in seinem Status "Sticky State" halten ".
Diffusion - Jedes Eingabebyte der Nachricht sollte auf die Bytes des Hash-Werts in gleich komplexer Weise verteilt werden. Bestimmte Hash-Funktionen erzeugen vorhersehbare Änderungen an bestimmten Bits im Hash. Dies macht die Kollisionserzeugung wieder trivial; Bei einer Nachricht, die einen Hash erzeugt, können leicht Kollisionen erzeugt werden, indem neue Werte in die Nachricht eingefügt werden, die sich nur auf die Bits auswirken, die sich vorhersagbar ändern.