Wie wird ein Passwort-Hash in der Schattenpasswortdatei codiert?

10

Ich lerne etwas über Linux-Passwortsicherheit (mehr Neugier als alles Nützliche) und verstehe, dass das echte Passwort gehasht und in der Schattenkennwortdatei gespeichert wird. Was ich nicht sicher bin und in meinem kurzen Googeln nicht finden konnte, ist, welche Codierung verwendet wird, um den Hash-Wert (und den Wert des Salzes) zu codieren. Es ist offensichtlich kein Hex und es ist offensichtlich Text, ausgenommen das :Zeichen. Kann mir hier jemand sagen, was diese Kodierung ist?

Bearbeiten: Ich verstehe das Hashing (MD5, SHA-X), das Salz und den Hashing-Spezifizierer. Was ich suche, ist die Methode zum Konvertieren der Hash-Ergebnisse (ein Byte-Array (Byte [])) in die Zeichenfolge, die ich in der Datei sehe, dh die Codierung.

Kreuz
quelle
Ihre Frage hängt sehr mit dieser Frage zusammen.
Broam
Verwenden Sie die Quelle: sourceware.org/git/?p=glibc.git;a=tree;f=crypt
James

Antworten:

10

Im Fall von MD5 crypt () ist das Salt nur eine zufällige Zeichenfolge mit bis zu 8 Zeichen aus [a-zA-Z0-9./].

Das Salt und das Passwort werden dann zusammen gehasht, durch eine Verstärkungsfunktion geleitet und dann mit einer Variante auf Base64 codiert:

  • Der MD5-Status (128 Bit) wird gemischt und in 6 Gruppen mit jeweils 3 Bytes unterteilt (die letzte Gruppe enthält 2 Bytes mit Null-Auffüllung).
  • Jede Gruppe von 3 Bytes wird dann in 4 Blöcke mit jeweils 6 Bits aufgeteilt
  • Schließlich wird jede 6-Bit-Gruppe einem Zeichen im Bereich [a-zA-Z0-9./] zugeordnet.
SimonJ
quelle
6

Wenn Sie nur wissen möchten, wie das Kennwort codiert ist, verwendet crypt () eine spezielle Codierung vom Typ Base64.

Die Base64-Codierung verwendet den folgenden Zeichensatz: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

Während die crypt () - Codierung diesen Zeichensatz verwendet: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Im Gegensatz zu Base64 gibt es auch keine "=" Auffüllung.

Andererseits erzeugen die crypt () - Implementierungen von MD5, SHA-X usw. mehr als nur ein zufälliges Salt, führen die Hash-Funktion aus und codieren sie mit der vorherigen Codierung.

Ich empfehle, diese beiden großartigen Beiträge zu lesen: "Passwort-Hashing mit MD5-Krypta in Bezug auf MD5" und "Implementierung von SHA512-Krypta gegen MD5-Krypta" , um eine vollständigere Erklärung zu erhalten.

Marco
quelle
2

Suchen Sie nach dem verwendeten Algorithmus?

Traditionell verwendeten Unix- und frühe Linux-Varianten ein geschwächtes DES, das auf maximal 8 Zeichen des Passworts basiert. Die meisten modernen Linux-Installationen verwenden MD5-Hashes für die Kennwörter und einige unterstützen SHA. Darüber hinaus wurde eine modularere Unterstützung für zusätzliche Algorithmen gezeigt, einschließlich Blowfish. Die von den meisten Linux-Versionen verwendete GNU libc unterstützt DES, MD5 und SHA und bietet Ihnen einige Optionen.

Der spezifische Typ des verwendeten Hash-Algorithmus wird als Anfang des Kennworts als $ DIGIT $ angegeben. Zum Beispiel ist $ 1 $ MD5.

Weitere Informationen erhalten Sie bei Wikipedia (siehe die Seite zu Crypt_ (Unix) ) oder bei Google für "Crypt Unix" oder "Crypt Linux".

Christopher Cashell
quelle