Hallo zusammen!
Ich suche gerade verzweifelt einen Weg zu finden, den Passwort Hash/Salt für folgendes Fallbeispiel zu berechnen:
Auf einem Linux System gibt es die Datei /etc/shadow. Die Zeilen dieser Datei beschreiben jeweils einen Benutzernamen mit Passwort der auf dem Linux System existiert. Als Beispiel gibt es für den Benutzer "csharp" mit dem Passwort "1337" folgende Zeile:
csharp:$6$qVnvjWpk$DOUTmbC9ROZ6s1h0hCZTYWLFfVeUWDbz8f0EUFPEJEC2UKQV0gRiIfoGpnaA.8i4RCcrGpOEHEd9xrAUDpo3Y/:18337:0:99999:7:::
Aufbau der Zeile
Wenn Ich OpenSSL (leider nicht teil des Systemes!) den Salt eingebe, bekomme Ich ein Teil der Zeile raus. (Die -6 sagt aus, dass es sich um SHA512 handelt)
Bisher habe Ich folgenden Ansatz als Lösungskonzept (Die oben genannte Zeile aus der /etc/shadow wurde als Beispiel genommen)
Ich suche gerade verzweifelt einen Weg zu finden, den Passwort Hash/Salt für folgendes Fallbeispiel zu berechnen:
Auf einem Linux System gibt es die Datei /etc/shadow. Die Zeilen dieser Datei beschreiben jeweils einen Benutzernamen mit Passwort der auf dem Linux System existiert. Als Beispiel gibt es für den Benutzer "csharp" mit dem Passwort "1337" folgende Zeile:
csharp:$6$qVnvjWpk$DOUTmbC9ROZ6s1h0hCZTYWLFfVeUWDbz8f0EUFPEJEC2UKQV0gRiIfoGpnaA.8i4RCcrGpOEHEd9xrAUDpo3Y/:18337:0:99999:7:::
Aufbau der Zeile
- Der Text vor dem ersten Doppelpunkt beschreibt den Benutzernamen => Split(":")[0]
- Das Zeichen hinter dem ersten "$" ist die Hash-Methode (MD5 => 1; SHA256 => 5; SHA512 => 6) => Split("$")[1]
- Der Text hinter dem zweiten "$" ist der Salt => Split("$")[2]
Wenn Ich OpenSSL (leider nicht teil des Systemes!) den Salt eingebe, bekomme Ich ein Teil der Zeile raus. (Die -6 sagt aus, dass es sich um SHA512 handelt)
Bisher habe Ich folgenden Ansatz als Lösungskonzept (Die oben genannte Zeile aus der /etc/shadow wurde als Beispiel genommen)
C#-Quellcode
- public static bool CheckCredentials(string username, string password) {
- string[] shadow = File.ReadAllLines("/etc/shadow");
- foreach(string entry in shadow) {
- // entry = csharp:$6$qVnvjWpk$DOUTmbC9ROZ6s1h0hCZTYWLFfVeUWDbz8f0EUFPEJEC2UKQV0gRiIfoGpnaA.8i4RCcrGpOEHEd9xrAUDpo3Y/:18337:0:99999:7:::
- if(entry.Split(":")[0] == username) {
- // hash = 6f0ac65fe01188660aad900bfe16c566ebf0e56c0a7d4a15bd831049108de80bd3a2fbf1a8b91662433a40458ec208a207cab073f190bd65b889e95e4fca8e09
- // $6 => SHA512
- string hash = HashSHA512(password);
- // salt = qVnvjWpk
- string salt = entry.Split("$")[2];
- // >>> Die eine Millionen Euro Frage: Stimmt das Passwort "1337"? <<<
- break;
- }
- throw new Exception($"User '{username}' was not found");
- }
- return false;
- }