Laden...

Problem mit SHA1CryptoServiceProvider

Erstellt von pkoeppe vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.019 Views
P
pkoeppe Themenstarter:in
319 Beiträge seit 2006
vor 14 Jahren
Problem mit SHA1CryptoServiceProvider

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:

  • Projekt entwickelt, kompiliert und XML mit Hashwerten erstellen lassen
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=

  • Zeit geht ins Land
  • Projekt (nur WindowsForms-Anwendung) weiterentwickeln (optional)
  • Projekt neukompilieren und XML mit Hashwerten erstellen lassen
    => liefert für Test.exe: FMGcfd3ZinVvLE/AxseSNXWSecc=
    => liefert für TestLib.dll: TIgOZbh0j6SDZPXrsvEMnjrpJKI=

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.

458 Beiträge seit 2007
vor 14 Jahren

AFAIK spielt die Systemzeit in den Salt mit.

be the hammer, not the nail!

P
pkoeppe Themenstarter:in
319 Beiträge seit 2006
vor 14 Jahren

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.

P
pkoeppe Themenstarter:in
319 Beiträge seit 2006
vor 14 Jahren

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.

F
10.010 Beiträge seit 2004
vor 14 Jahren

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.

P
pkoeppe Themenstarter:in
319 Beiträge seit 2006
vor 14 Jahren

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.