Der SHA512-Salted-Hash von mkpasswd stimmt nicht mit einer Online-Version überein

Der SHA512-Salted-Hash von mkpasswd stimmt nicht mit einer Online-Version überein

Ich bin verwirrt über den Hash-Code (ASCII), der unter Linux (Ubuntu) /etc/shadow gespeichert ist.

Nehmen wir einen hypothetischen Fall an, lassen Sie das Passwort'prüfen', Salz sein'Zem197T4'.

Durch Ausführen des folgenden Befehls

$ mkpasswd -m SHA-512 test Zem197T4

Es wird eine lange Reihe von ASCII-Zeichen generiert (so speichert Linux tatsächlich in /etc/shadow).

$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0

Bei Verwendung eines Online-SHA-512-Generators (z. B.http://www.insidepro.com/hashes.php?lang=eng), wird der folgende Hex-Code generiert:

Option 1) Passwort+Salt

8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2

Option 2) Salt+Passwort

b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2

Ich glaube, dieser Hex-Code sollte „dasselbe“ sein wie der von mkpasswd generierte ASCII-Code. Aber wie hängen sie zusammen?

Hoffe, jemand kann mich aufklären?

Antwort1

Unter Ubuntu/Debian mkpasswdist Teil des PaketsWer istmkpasswd.cund in which als eigentlich nur ein ausgeklügelter Wrapper um die crypt()in glibc deklarierte Funktion implementiert unistd.h. crypt() nimmt zwei Argumente an: Passwort und Salt. Passwort ist in diesem Fall „test“, Salt wird durch „$6$“ für den SHA-512-Hash vorangestellt (sieheSHA-Verschlüsselung), daher wird „$6$Zem197T4“ an crypt() übergeben.

Vielleicht ist Ihnen die -ROption aufgefallen mkpasswd, die die Anzahl der Runden bestimmt. Im Dokument finden Sie einen Standardwert von 5000 Runden. Dies ist der erste Hinweis, warum das Ergebnis niemals der einfachen Verkettung von Salt und Passwort entsprechen würde, es wird nicht nur einmal gehasht. Tatsächlich -R 5000erhalten Sie dasselbe Ergebnis, wenn Sie es weitergeben. In diesem Fall wird „$6$rounds=5000$Zem197T4“ an crypt() übergeben und die Implementierung in glibc (das ist die libc von Debian/Ubuntu) extrahiert daraus die Methode und die Anzahl der Runden.

Was in crypt() passiert, ist komplizierter als nur die Berechnung eines einzelnen Hashs und das Ergebnis ist am Ende base64-kodiert. Deshalb enthält das von Ihnen angezeigte Ergebnis nach dem letzten '$' alle möglichen Zeichen und nicht nur [0-9a-f] wie in der typischen Hex-Zeichenfolge eines SHA-512-Hashs. Der Algorithmus wird im bereits erwähnten ausführlich beschriebenSHA-Verschlüsselungdokumentieren.

Antwort2

Die Grundidee hinter der Verwendung eines gesalzenen Passworts besteht darin, dass Sie jedes Mal, wenn Sie einen Hash für dasselbe Passwort generieren, ein anderes Ergebnis erhalten. Dadurch sollen Probleme mit Rainbow-Tabellen vermieden werden.

Angenommen, einer Ihrer Benutzer verwendet ein schwaches Passwort, sagen wir 123456. Ihre /etc/shadow-Datei wurde offengelegt. Jetzt muss der böse Hacker nur noch eine Rainbow-Tabelle verwenden, um das schwache Passwort herauszufinden und es an anderen Orten erneut zu verwenden.

verwandte Informationen