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 mkpasswd
ist Teil des PaketsWer istmkpasswd.c
und 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 -R
Option 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 5000
erhalten 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.