Mögliches Duplikat:
Ist es möglich, md5-Hashes zu entschlüsseln?
i verwendet md5.new()
; md5.update("aaa")
, md5.digest()
um einen md5-Hash der Daten zu bilden "aaa"
. Wie erhält man die Daten mit Python zurück?
Mögliches Duplikat:
Ist es möglich, md5-Hashes zu entschlüsseln?
i verwendet md5.new()
; md5.update("aaa")
, md5.digest()
um einen md5-Hash der Daten zu bilden "aaa"
. Wie erhält man die Daten mit Python zurück?
Sie können einen md5-Hash nicht dekodieren, da Hashing ein Prozess ist, den man sich am besten als Einweg-Kodierung (d. h., was gehasht wurde, kann nicht de-hasht werden; man kann nur feststellen, was gehasht wurde, entweder durch Prüfung einer Liste bekannter Hashes oder durch Hashing einer Reihe von Eingaben und Abgleich der resultierenden Hashes mit dem Hash, den man zu "entschlüsseln" versucht).
Laut Wikipedia sind die wichtigsten Merkmale eines solchen Hash-Algorithmus folgende:
ist es undurchführbar, eine Nachricht zu finden zu finden, die einen bestimmten Hashwert hat,
es ist es nicht möglich ist, eine Nachricht zu ändern, ohne ihren Hash zu ändern,
ist es undurchführbar zwei verschiedene Nachrichten mit demselben gleichen Hash zu finden.
Solche Algorithmen werden heute am häufigsten verwendet:
Wenn Sie die Daten in beide Richtungen verschlüsseln wollen, müssen Sie sich andere kryptografische Bibliotheken für Python ansehen (Wie üblich hat Stackoverflow eine Empfehlung ).
Wenn es nicht "dekodiert" werden soll, dann ist "kodieren" eine eher schlechte Wortwahl. Warum nicht der traditionelle "Einweg-Hash"?
@: Weil Einwegverschlüsselung ein falscher Begriff ist, der nur von denen verwendet wird, die nicht genau wissen, wovon sie reden.
Ein Hash ist nicht notwendigerweise einseitig, aber MD5 ist es auf jeden Fall ;) Ein Hash ist nur dann einseitig, wenn es zu Kollisionen kommt, so dass zwei verschiedene Eingaben das gleiche Ergebnis haben.
Könnten Sie das näher erläutern? warum es keinen Sinn macht? Wenn man es aus einer mathematischen Perspektive betrachtet, ist ein Hash lediglich eine Funktion h(x)=y
donde h
ist die Hash-Funktion, x
ist die Eingabe, und y
ist die Ausgabe. Ein Hash ist nur einseitig, wenn es einen solchen gibt x
y z
que h(x)=y
et h(z)=y
angesichts der Tatsache, dass x != z
. Angenommen, h(x)
ist nur eine Kennung (z. B. x
ein Integer- oder Char-Typ ist), oder auch nur eine einfache Drehung. Dies wäre vollständig umkehrbar und somit nicht einseitig.
Ich weiß nicht, wie es bei Python ist, aber Hash-Funktionen sind unumkehrbar. Zunächst einmal ist zu beachten, dass Hash-Funktionen eine Ausgabe mit konstanter Länge liefern - was bedeutet, dass Informationen weggeworfen werden (Sie können eine Datei von 3 MB hashen und erhalten trotzdem nur ein Ergebnis von weniger als 1 kB). Darüber hinaus sind Hash-Funktionen dafür gemacht, dass sie nicht umkehrbar sind. Wenn Sie eine Verschlüsselung benötigen, verwenden Sie nicht Hashing, sondern Verschlüsselung - eine wichtige Anwendung von Hashing ist, wenn die Datenbankinformationen durchgesickert sind (die Hashes enthielten), dass die Passwörter nicht kompromittiert wurden (es gibt noch mehr Beispiele, aber dies ist das offensichtlichste)
Dies gilt nur für kryptografische Hash-Funktionen. Eine rein mathematische Hash-Funktion hat keine eigene Größe hash(n) = n % 101, auch wenn es bei den meisten Implementierungen eine Typgröße geben wird. Dies ist eine gängige Methode, um Werte auf Array-Indizes abzubilden. Obwohl sie irreversibel ist (es sei denn, man weiß, dass n <101 ist), ist es ziemlich einfach, mögliche Eingaben vorherzusagen.
Wenn Sie einen Hash brechen wollen, z. B. einen Passwort-Hash. Dann brauchen Sie eine sehr große Nachschlagetabelle. John the Ripper wird häufig verwendet, um Passwörter mit Hilfe eines Wörterbuchs zu knacken. Dies ist eine sehr gute Methode, vor allem, wenn es sich um einen gesalzenen Passwort-Hash handelt.
Ein anderer Ansatz ist die Verwendung eines Regenbogen-Tisch Diese benötigen jedoch viel Zeit zur Erstellung. Es gibt kostenlos online zugängliche Regenbogentische .
Hier ist ein Python-Skript zur Durchführung eines md5()-Brute-Force-Angriffs.
Um das Argument der anderen zu ergänzen: MD5 ist ein einseitiger Hash. Üblicherweise werden zwei Eingabewerte gehasht, und wenn die gehashten Werte übereinstimmen, dann wird die Eingabe sollte gleich sein. Es ist unsinnig, von einem mit MD5 gehashten Wert zur Hash-Eingabe zu wechseln. Was Sie wahrscheinlich wollen, ist ein symmetrischer Verschlüsselungsalgorithmus - siehe Zwei-Wege-Schlüssel-Verschlüsselung/Hash-Algorithmus für eine gute Diskussion zu diesem Thema.
"md5 ist ein Einweg-Hash" Dieser Satz ist nicht falsch, aber er impliziert fälschlicherweise, dass es Zweiweg-Hashes gibt...
@Jasper - MD5 ist eine Einweg-Hash-Funktion, was sie zu einem Kandidaten für eine kryptographisch Hash-Funktion, und Sie haben Recht, dass die Zwei-Wege kryptographisch Hash-Funktionen sind völliger Unsinn. Ich hätte wohl sagen sollen: "MD5 ist eine kryptografische Hash-Funktion und daher von Natur aus unumkehrbar".
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
13 Stimmen
Nein, weder in Python noch in einer anderen Programmiersprache
7 Stimmen
Md5() ist keine "Verschlüsselungs"-Funktion. Es gibt keine Umkehrung, und wenn es eine gäbe, könnte sie nicht für Passwörter verwendet werden.
9 Stimmen
Daten -> hash = steak -> hamburger
3 Stimmen
@Paul Sasik: eher Kuh -> Steak, versuchen Sie, diese Operation umzukehren ;)
1 Stimmen
Glauben Sie nicht an die Hasser. MD5 ist derzeit so fehlerhaft, dass man die Umkehrung mit einem Kollisionsangriff lösen kann, der auf einem Computer mit einem 2,6-GHz-Pentium-4-Prozessor (Komplexität von 224,1) innerhalb von Sekunden Kollisionen finden kann. Der ursprüngliche Code würde eine Regenbogentabelle erfordern, aber man kann relativ schnell andere Zeichenketten finden, die denselben Hashwert ergeben. Aus diesem Grund ist es veraltet. de.wikipedia.org/wiki/MD5#Sicherheit