Benutzer mit den meisten Antworten
PHP sha1 Hash anders als C# sha1 hash

Frage
-
Hallo,
ich bin derzeit noch daran meine Dateien mittels eines sha1 Hash Codes abzugleichen. Das Problem ist nur, mein PHP Script gibt andere Hash Codes zurück als meine C# Funktion.
Meine PHP Hashes sind zu finden unter: http://files.de.theminequest.de/listFiles.php?version=1.0.0-A5
Meine C# SHA1 Funktion lautet:
public static string GetSHA1Hash(string text) { var SHA1 = new SHA1CryptoServiceProvider(); byte[] arrayData; byte[] arrayResult; string result = null; string temp = null; arrayData = Encoding.UTF8.GetBytes(text); arrayResult = SHA1.ComputeHash(arrayData); for (int i = 0; i < arrayResult.Length; i++) { temp = Convert.ToString(arrayResult[i], 16); if (temp.Length == 1) temp = "0" + temp; result += temp; } return result; }
Stimmt irgendetwas mit meiner SHA1 Funktion nicht, oder wieso kommen hierbei unterschiedliche Hashes dabei heraus?
Viele Grüße aus Stuttgart
Christian Holzwarth- Bearbeitet Christian Holzwarth Montag, 20. Januar 2014 19:00
Antworten
-
Also ich bekomme auch nicht den 2a...-Hash heraus.
Wie wird denn der Hash unter PHP generiert? Direkt aus der Datei oder aus einem String? Welche Kodierung hat der String (bzw. unter welcher Kodierung werden die Bytes abgerufen)?
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Christian Holzwarth Montag, 20. Januar 2014 20:49
Alle Antworten
-
Hallo,
du ermittelst mit der Funktion den Hash eines Strings. Du brauchst aber den Hash der Dateibytes:arrayResult = SHA1.ComputeHash(File.ReadAllBytes("Dateiname"));
Wenn du dann immernoch unterschiedliche Werte heraus bekommst, poste mal bitte eine Beispiel dazu (den Link zu einer Datei) und deren Hashcode - laut PHP.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo,
du ermittelst mit der Funktion den Hash eines Strings. Du brauchst aber den Hash der Dateibytes:arrayResult = SHA1.ComputeHash(File.ReadAllBytes("Dateiname"));
Wenn du dann immernoch unterschiedliche Werte heraus bekommst, poste mal bitte eine Beispiel dazu (den Link zu einer Datei) und deren Hashcode - laut PHP.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.Ich hab mir jetzt mal eine zweite Funktion gemacht die nur die Dateihashes errechnen soll. Der QUelltext lautet wie folgt:
public static string GetSHA1HashFile(string file) { var SHA1 = new SHA1CryptoServiceProvider(); byte[] arrayResult; string result = null; string temp = null; arrayResult = SHA1.ComputeHash(File.ReadAllBytes(file)); for (int i = 0; i < arrayResult.Length; i++) { temp = Convert.ToString(arrayResult[i], 16); if (temp.Length == 1) temp = "0" + temp; result += temp; } return result; }
Link zur Datei: http://files.de.theminequest.de/ForgeModLoader-client-0.log
Laut PHP müsste folgender Hash herauskommen: 2a745bb58551e0bce833c6c3ee3629259114181a
Laut C# kommt folgender Hash heraus: d93d8939d83cfcd7116dd8e64c7ca27f958a84ae
Viele Grüße aus Stuttgart
Christian Holzwarth -
Also ich bekomme auch nicht den 2a...-Hash heraus.
Wie wird denn der Hash unter PHP generiert? Direkt aus der Datei oder aus einem String? Welche Kodierung hat der String (bzw. unter welcher Kodierung werden die Bytes abgerufen)?
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Christian Holzwarth Montag, 20. Januar 2014 20:49
-
Also ich bekomme auch nicht den 2a...-Hash heraus.
Wie wird denn der Hash unter PHP generiert? Direkt aus der Datei oder aus einem String? Welche Kodierung hat der String (bzw. unter welcher Kodierung werden die Bytes abgerufen)?
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.Also ich weis echt nicht wo ich ohne deine Hinweise stehen würde... natürlich habe ich auf dem Webserver denselben Fehler gemacht wie in C# und nur den String als sha1 codiert... also den Dateipfad. Habe das jetzt einmal geändert, der neue Hash lautet: 9e1650ce1b307e062917f2d2189158c32005deed
Dieser stimmt mit dem von mir berechneten überein... Danke dir.
Viele Grüße aus Stuttgart
Christian Holzwarth -
Hi!
Das ist nicht ganz so einfach da es einige Fallstricke zu beachten gilt:
Aller PHP-CODE der ausgeführt wir muss in Deinem Fall in seinen Dateien als Unicode utf-8 definiert sein.
Das ist nicht allein damit getan das die Dateien nur in UTF-8 kodiert sind! Du must den PHP Interpiler explizit anweisen das der Code als UTF-8 verarbeitet wird. Das geht bei PHP bis Version 5.3.* indem Du am Anfang, direkt nach dem ersten öffnenden PHP-Tag folgende Anweisung nutzt:declare ( encoding = 'UTF-8' );
Neuere PHP Versionen können anhand des BOM erkennen welche Kodierung genutzt wird oder man gibt in der php.ini unter zend.script_Encoding eine feste Kodierung an die für alle Skipte gilt.
Erst dann kannst Du sicher sein das das was PHP erzeugt auch in .NET nachvollziehbar erzeugt werden kann.
Ferner kannst Du nicht den C# Code nutzen den Du gepostet hast. Die Bytes die Sha1 von .NET liefert (das selbe gilt für MD5 und andere ähnliche Algos) müssen in ihre Hexadezimale Entsprechung konvertiert werden.
public static string PhpSha1(string s, Encoding e) { var sha1 = new SHA1CryptoServiceProvider(); var data = e.GetBytes(s); data = sha1.ComputeHash(data); sha1.Clear(); return data.Aggregate("", (current, t) => current + t.ToString("x2").ToLower()); }
Als Encoding nimmst Du z.B:
PhpSha1('...', new UTF8Encoding(false)
Gruß, Ulf