Ich werde einen anderen Ansatz versuchen, um dies zu beantworten. Ich werde Ihnen nicht sagen, dass etwas schlecht ist, und nicht erklären, warum. Ich werde Schritt für Schritt genau erklären, warum es schlecht ist, und zeigen Ihnen, wie Sie es brechen können, aber ich werde nicht zu tief in die Regenbogentabellen gehen ... es wird davon ausgegangen, dass Sie wissen, was das ist ist.
Hier ist der Grund, warum der Hash Ihres Entwicklers falsch ist: weil er nur einige Faktoren einführt, die nach der Entdeckung der Methode völlig brutal erzwungen werden könnten, selbst wenn er das Mischen zufällig auswählen würde.
Wie? Denn wenn ich Zugriff auf Ihren Server habe, kenne ich auch die Methode, mit der Ihr Entwickler Ihr Kennwort hasht, weil ich diesen Code ebenfalls gestohlen habe, und ich kann alles neu anordnen, um es meiner kleinen Crackpot-Anwendung anzupassen.
Nehmen wir an, ich habe Ihr Unternehmen gehackt und Zugriff auf Ihre Datenbank erhalten, damit ich diese Hashes erhalten kann. Ich weiß, wann sich Benutzer registrieren, richtig? Ich weiß, wann sie ihr Passwort zuletzt geändert haben, denn wenn Sie kein Neuling sind, sollten Sie diese Informationen in der Datenbank protokollieren.
$ time = date ('mdYHis');
Dieser Zeitstempel ist wahrscheinlich ungefähr zu der Zeit, zu der der Benutzer sein Passwort registriert oder geändert hat. Wir können dies wissen, da das letzte Mal, als es aktualisiert wurde, in der Datenbank gespeichert werden sollte. Die Zeit, die Sie registriert haben, sollte in der Datenbank gespeichert werden. Ein Teil der Krypta wurde besiegt.
$ rand = mt_rand (). '\ n';
Cool, ein Zufallszahlengenerator. Wissen Sie, auf Computern ist nichts wirklich zufällig. Zufallszahlengeneratoren sind nicht wirklich zufällig. Dies ist der Mersenne Twister
. Ich brauche nur 624
verschiedene Kombinationen, um alle zukünftigen Zahlen herauszufinden. Ich habe auch Ihr "Salz" aus der Datenbank gestohlen und weiß, wie Sie es berechnen.
Da ich die Daten kenne, an denen sich Ihre Benutzer registriert haben, kann ich die richtige Nummer für die Mersenne Twister-Routine zu diesem bestimmten Zeitpunkt neu erstellen. Ich kann eine kleine Cracking-Methode schreiben, um die genaue Zahl zu ermitteln, die zu diesem Zeitpunkt wahrscheinlich auftreten würde. Dein Salz ist nicht mehr zufällig. Aber weißt du was? Es ist irrelevant. Ich kenne das genaue Format, das Sie für dieses Salz verwenden, und ich habe es wahrscheinlich trotzdem aus Ihrer Datenbank erhalten. Dann kann ich Rainbow Tables verwenden, um Ihr Salz in weniger als einer Sekunde vollständig zu vernichten, da mt_rand ()
allein maximal 10 ^ 10
Hashes und ein Minimum von erzeugt 10 ^ 9
, was 11 Milliarden Möglichkeiten bedeutet, und da alle Zahlen sind und ich das Format Ihres Salzes kenne, werden sie in weniger als einer Sekunde geknackt.
Also jetzt Ich weiß, wem dieser Benutzername gehört, weil ich Ihre Datenbank aufgebockt habe. Ich weiß, wann sie sich registriert haben, wann sie ihr Passwort zuletzt geändert haben und ich kenne Ihre Zufallszahl. Ich sehe dich, Dave, einen Dieb auf dem Dach. Meine neue Satellitenverbindung hat sowohl Infrarot- als auch Röntgenspektrum. Ich sehe dein Herz schlagen. Ich sehe, Sie haben Angst.
Nachdem $ crypt
besiegt wurde, werfen wir einen Blick auf die -Funktion hash_it ()
.
-Funktion hash_it ($ string1, $ string2) {$ pass = md5 ($ string1); $ nt = substr ($ pass, 0,8); $ th = substr ($ pass, 8,8); $ ur = substr ($ pass, 16,8); $ ps = substr ($ pass, 24,8); $ hash = 'H'.sha1 ($ string2. $ ps. $ ur. $ nt. $ th); return $ hash}
Schauen wir uns nun einige Beispieleingaben an: hash_it (Dave, testpassword1);
Ergebnisse:
$ pass = "b7e055c6165da55c3e12c49ae5207455" $ nt = "b7e055c6"; $ th = null; $ ur = "3e12c49a"; $ ps = "e5207455";
$ hash Input
: "H" + "Benutzername +" Registrierungsdatum "+" 1604716014 "+" e5207455 "+" 3e12c49a "+" b7e055c6 "(tldr: "HDaveRegistrationDate1604716014e52074553e12c49ab7e055c6"
)
$ hash = 'H'.sha1 ("DaveRegistrationDate1604716014e52074553e12c49ab7e055c6);
` $ hash output : "6b347a1521b6b84501806268614abe1e7324c703; Zeit)
So könnte ein Angriff funktionieren :
- Mersenne Twister (
mt_rand ()
) nach 624 brechen Beobachtungen oder einfach Rainbow Table das Salz. - Nimm Daves
REGISTRATION_DATE
aus der Datenbank oder den USER_LAST_MODIFIED_DATE
- Nimm Daves SHA1 Hash
- Initiieren Sie einen Brute-Force-Angriff (er wird zu einem statischen sha1-Hash, nachdem wir Ihre "Sicherheit" verletzt haben) mit den folgenden Parametern:
-
"Benutzername"
+ "RegistrationDate"
+ YourRandomNumber
+ DictionaryAttack[‹
-
-
ol> Und das ist die Geschichte, warum Sie Ihre eigene Kryptographie nicht rollen sollten, es sei denn, Sie wissen wirklich, was Sie tun. Stellen Sie sich vor, ich wäre ein echter Cracker. und nicht so jemand, der gerade Ihren Code rückwärts durchgesehen hat.