richtiger MD5 Algorithmus gesucht
-
Ich wünsche einen guten Abend,
da ich einen Mangel an C# Tools für die Verwaltung von htaccess Dateien entdeckt habe (ich aber unbedingt eines brauche) will ich mich jetzt selber hinsetzen und dafür etwas programmieren.
Wenn ich das Verschlüsselungstool vom Apache (htpasswd.exe) benutze sagt er mir, dass er für die Verschlüsselung einen MD5 Verschlüsslungsalgorithmus (Hash) verwendet. So habe mich gleich auf die Suche nach MD5 für C# gemacht. Bin auch schnell fündig geworden. Hier ein Quelltext dafür.
private string encryptString(string strToEncrypt) { System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding(); byte[] bytes = ue.GetBytes(strToEncrypt); // encrypt bytes System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] hashBytes = md5.ComputeHash(bytes); // Convert the encrypted bytes back to a string (base 16) string hashString = ""; for(int i=0;i<hashBytes.Length;i++) { hashString += Convert.ToString(hashBytes[i],16).PadLeft(2,'0'); } return hashString.PadLeft(32,'0'); }
Das ist nur eines von vielen Beispielen, die mir alle das Ergebnis "098f6bcd4621d373cade4e832627b4f6" auf die Eingabe "test" liefern.
Wenn ich diese Ausgabe für die ".htpasswd" im Apache hernehme, kommt keine gülitge Authentifizierung zustande. Das Apache Tool bringt mit für die gleiche Eingabe (test) die Ausgabe "CX/.....$PKgwL7DXQBQgXkNyKwLDP." Weiß hier jemand Abhilfe zu meinem Problem? Denn so bin ich ein bischen aufgeschmissen.
Mir ist auch aufgefallen, dass mir das Apache Tool bei jedem neuen Aufruf eine andere Ausgabe bringt (ist ja auch Sinn und Zweck der Übung). Während dagegen die C# Variante immer das gleiche Ergebnis bringt.
Gruß
Markus Seidl
-
Ich hab jetzt nicht ganz geblickt, was das Apache-Tool macht oder machen soll. Aber dass du bei diesem C#-Programm immer das selbe Ergebnis kriegst, ist doch völlig logisch, wenn du die Eingabe nicht änderst. Der MD5CryptoServiceProvider scheint auch korrekt zu arbeiten, wie ich an ein paar Dateien beispielhaft überprüft habe, das ist also ein "richtiger" MD5-Algorithmus.
static class Program { private static void Main() { MD5 md5 = new MD5(); byte[] result; string line = Console.In.ReadLine(); using( FileStream stream = new FileStream(line, FileMode.Open) ) result = md5.ComputeHash(stream); string hash = ""; foreach( byte x in result ) hash += Convert.ToString(x, 16).PadLeft(2,'0'); Console.Out.WriteLine("Hash: " + hash); } }
Mir ist auch aufgefallen, dass mir das Apache Tool bei jedem neuen Aufruf eine andere Ausgabe bringt (ist ja auch Sinn und Zweck der Übung).
Schon möglich, dass das sinnvoll ist, dann steckt aber mehr dahinter als MD5. Mich deucht, du hast ein Problem mit Apache und nicht mit C#, kann das sein?
-
ich glaube es wird die Funktion crypt benutzt (unter Linux)
-
ok sorry unter windows wird wohl doch md5 genutzt:
-
Apache Doc schrieb:
htpasswd encrypts passwords using either a version of MD5 modified for Apache, or the system's crypt() routine.
Quelle: http://httpd.apache.org/docs/2.0/programs/htpasswd.html
-
geeky schrieb:
Apache Doc schrieb:
htpasswd encrypts passwords using either a version of MD5 modified for Apache, or the system's crypt() routine.
Quelle: http://httpd.apache.org/docs/2.0/programs/htpasswd.html
Was in letzter Konsequenz wohl soviel heißt wie, dass ich mit C# nicht drumherum komme ohne die htpasswd.exe auszukommen. Da der MD5 Algorithmus von .NET eben nicht der gleiche ist, wie Apache ihn verwendet. Lieg ich da richtig?
Gruß
Markus Seidl
-
Endlich habe ich einen Lösung für C# gefunden, aber mit habe ich auch nur eine Lösung gefunden. Eine Portierung eines Java Quelltextes der genau dieses Crypt von Linux (und damit auch das für Apache) erledigt.
Ohne Eure Antworten wäre ich aber auch nicht auf die Lösung gekommen. Danke!
Gruß
Markus Seidl
PS: hier die Portierung falls es mal jemand braucht http://www.codeproject.com/csharp/UnixCrypt.asp
PS: Der grund warum das Apache Tool immer wieder einen anderen Hash erzeugt, liegt daran, dass dieser Hash mit einem zusätzlich Salt versehen ist, der eben nicht mit angegeben werden kann, und deswegen zufällig ausgewählt wird.