Wie werden die Hashes in /etc/shadow generiert?

Wie werden die Hashes in /etc/shadow generiert?

Ich las dieWikipedia-Artikelin der Schattendatei und dort wurde erwähnt, dass das Format der Zeilen wie folgt ist:

$id$salt$hashed

Meine Frage ist also: Wie funktioniert es?

Ich habe versucht, den Hash für mein eigenes Konto zu berechnen, für das ich das Passwort hatte. Dazu habe ich diesen Befehl verwendet:

sha512sum {salt}+{mein_Klartext_Passwort}

Aber die Ausgabe unterscheidet sich von dem Hash, den ich selbst sehe. Wie funktioniert es also? Was übersehe ich?

Antwort1

Ein paar Dinge, über die Sie nachdenken sollten (zur Bestätigung müssen Sie die Quellen in den Linux-Coreutils und glibc2 lesen)

  • Die Ausgabe von sha512sum scheint eine druckbare Hex-Notation zu sein, während die in der Schattendatei gespeicherte Ausgabe anscheinend Base64 ist, sodass sie unterschiedlich sind.

  • Ich denke, dass die SHA512-Summe in der Schattendatei mehr als einmal durch die Hash-Funktion geleitet wurde ( #define ROUNDS_DEFAULT 5000), während die SHA512-Summe die „Datei“ nur einmal durch den Hash leitet.

  • Möglicherweise wird durch einen oder beide Befehle eine Polsterung hinzugefügt, um die Daten auszurichten; diese kann unterschiedlich sein.

Antwort2

Wenn Sie den Hash auf die gleiche Weise erstellen möchten, wie die /etc/shadowDatei ihn speichert, verwenden Sie den folgenden Befehl:

mkpasswd --method=sha-512 --salt=YOUR_SALT PASSWORD

Antwort3

Von demshadow(5)man-Seite:

verschlüsseltes Passwort

Beziehen aufKrypta(3) für Details zur Interpretation dieser Zeichenfolge.

Wenn das Kennwortfeld eine Zeichenfolge enthält, die kein gültiges Ergebnis istKrypta(3), beispielsweise ! oder *, kann der Benutzer kein Unix-Passwort zum Anmelden verwenden (der Benutzer kann sich jedoch auf andere Weise beim System anmelden).

Dieses Feld kann leer sein. In diesem Fall sind keine Passwörter erforderlich, um sich mit dem angegebenen Anmeldenamen zu authentifizieren. Einige Anwendungen, die die Datei /etc/shadow lesen, können jedoch entscheiden, überhaupt keinen Zugriff zuzulassen, wenn das Passwortfeld leer ist.

Ein Kennwortfeld, das mit einem Ausrufezeichen beginnt, bedeutet, dass das Kennwort gesperrt ist. Die restlichen Zeichen in der Zeile stellen das Kennwortfeld dar, bevor das Kennwort gesperrt wurde.

Von demcrypt(3)man-Seite:

crypt() ist die Funktion zur Kennwortverschlüsselung. Sie basiert auf dem Data Encryption Standard-Algorithmus mit Variationen, die (unter anderem) die Verwendung von Hardwareimplementierungen der Schlüsselsuche verhindern sollen.

Schlüssel ist das vom Benutzer eingegebene Passwort.

Salt ist eine zweistellige Zeichenfolge aus der Menge [a–zA–Z0–9./]. Diese Zeichenfolge wird verwendet, um den Algorithmus auf eine von 4096 verschiedenen Arten zu stören.

Indem man die niedrigsten 7 Bits der ersten acht Zeichen des Schlüssels nimmt, erhält man einen 56-Bit-Schlüssel. Dieser 56-Bit-Schlüssel wird verwendet, um eine konstante Zeichenfolge (normalerweise eine Zeichenfolge, die nur aus Nullen besteht) wiederholt zu verschlüsseln. Der zurückgegebene Wert zeigt auf das verschlüsselte Passwort, eine Reihe von 13 druckbaren ASCII-Zeichen (die ersten beiden Zeichen stellen das Salt selbst dar). Der Rückgabewert zeigt auf statische Daten, deren Inhalt bei jedem Aufruf überschrieben wird.

verwandte Informationen