Hallo zusammen,
mir ist gerade eine ziemlich bescheidene Sache aufgefallen. Für ein Autoupdate erstelle ich mir eine XML-Datei, die Namen und Hashwerte von Dateien enthält. So dass beim Update nur die Dateien aktualisiert werden, bei denen der Hashwert der vorhandenen nicht mit dem der im Updateverzeichnis liegenden übereinstimmt. Funktioniert an für sich auch. Nun aber mein Problem. In der Solution sind zwei Projekte drin eine WindowsForms-Anwendung und eine Klassenbibliothek, die über Verweise in der WindowsForms-Anwendung eingebunden ist. Wenn ich nun neukompiliere, dann ändert sich der Hash der verwendeten Klassenbiblioteks-DLL, obwohl ich in der nichts geändert habe. Nochmal zum Ablauf:
FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] buffer = new SHA1CryptoServiceProvider().ComputeHash(fileStream);
fileStream.Close();
return Convert.ToBase64String(buffer);
=> liefert für Test.exe: i35COVeuEjZ2QaeukcQm7DesuwU=
=> liefert für TestLib.dll: dWl43AAv4xaIac+CIG+jst2FBn4=
Wie erkennbar ist der Hash der DLL ein anderer, aber ich habe doch nichts am Quellcode der DLL geändert.
Wenn ich nur neu erstelle ohne Änderungen, dann ist es genauso. Warum? Ist der Hashwert von der Erstellzeit abhängig oder wie?
Danke für Eure Hilfe.
pkoeppe
Wer nicht fragt, bleibt dumm.
AFAIK spielt die Systemzeit in den Salt mit.
be the hammer, not the nail!
Hat wer von Euch eine Idee, ob und wie ich das ändern kann? Bzw. wie müsste mein Updatemechanismus aussehen, damit er ohne Hashs nur geänderte Dateien aktualisiert?
Wer nicht fragt, bleibt dumm.
Irgendwie, ich weiß auch nicht. Ich habe noch ein paar dat-Dateien und habe nun mal geschaut, wie es sich bei denen verhält. Also habe ich den Hash von Test.dat bestimmen lassen. Dann habe ich die Datei geöffnet, unter einem anderen Namen (Test2.dat) gespeichert und den Hashwert erstellen lassen. Und zu guter Letzt die alte dat-Datei (Test.dat) gelöscht und die neue mit dem anderen Namen so umbenannt, dass sie so heißt, wie die gerade gelöschte (Test2.dat => Test.dat). Und nun haltet Euch fest der Hashwert aller drei Dateien ist gleich, muss man das verstehen?
Also bei exe und dll spielt der Erstellzeitpunkt eine Rolle und bei sonstigen nicht?
Wäre dankbar, wenn mir das jemand erklären könnte.
Wer nicht fragt, bleibt dumm.
Das hat überhaupt nichts mit SHA1 zu tun.
Auch wenn du nichts am Code änderst, wird beim neucompilieren ein neuer Header
in die EXE/DLL geschrieben, also ist der hash dann auch anders.
Okay, danke für die Info.
Habe auf codeproject jetzt eine andere Art des Autoupdates (http://www.codeproject.com/KB/vb/Auto_Update_Revisited.aspx) gefunden. Die funktioniert allerdings nur für Versions-"belastete" Dateitypen, also exe und dll, und unversionierte Dateien. Das heißt ich werde mir dann wohl einen Hybriden aus dem Ansatz und meinem basteln, der für exe und dll Dateien den FileVersionInfo-Ansatz nutzt und für den Rest meinen Hashwert-Ansatz.
Wer nicht fragt, bleibt dumm.