Salzen Sie eine C# - MD5-ComputeHash auf einem stream
Ich sehe keinen Weg, um Salz MD5.ComputeHash(Stream).
Fehlen mir einige Weise des Einspritzens von bytes in der HashAlgorithm?
Ich habe versucht, die Durchführung einer ComputeHash(byte[]) vor der Durchführung der stream berechnen, aber überraschend, es hatte keine Wirkung. Irgendwelche Ideen (abgesehen von der änderung der Datei)?
Vielen Dank für Ihre Zeit.
Nachtrag
Nur um ein wenig konkreter, ich möchte einen stream, verwenden um ein hash auf eine große Datei, ich will nicht in den Speicher geladen.
FileInfo myFI= new FileInfo("bigfile.dat");
FileStream myIFS = piFile.OpenRead();
MD5 md5 = MD5.Create();
byte[] hash = md5.ComputeHash ( myIFS );
myIFS.Close ();
- Ich weiß nicht, ob es eine spezielle Art Salz des Algorithmus. Aber Sie könnte einfach erstellen Sie Ihre eigenen Stream-Klasse, wickelt der angegebenen Stream-Objekts. Wenn gefragt, für die ersten paar bytes, die wrapper-Objekt geben könnte, die salt-bytes, und starten Sie dann proffering die zugrunde liegende stream-bytes.
- In diesem Fall, mit der information, ein Salz ist unnötig und wahrscheinlich auch nicht möglich zu implementieren (man erinnere sich, dass Salze gespeichert werden müssen mit der salthashed Daten).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort auf den Mangel an Beispielen ist meiner Meinung nach: Sie brauchen nicht wirklich zu Salzen.
Den hash-Algorithmus wie MD5 eine Tabelle von bytes beliebiger Länge und konvertiert diese in eine Tabelle von bytes der bekannten Länge - der Vorgang ist nicht ohne weiteres reversibel ist und kleine änderungen an der Eingabe-Tabelle zu unvorhersehbaren änderungen in der Ausgabe-Tabelle:
input => MD5 => Ausgabe
Den Zweck von Salzen ist der Schutz gegen Angriffe, wo Nutzer bereits im Voraus berechnete Tabelle der hash-Ergebnisse (Regenbogen-Tabellen). Durch die Einführung von kleinen änderungen in der Eingabe, die Ergebnisse ändern sich drastisch, so dass selbst wenn ein Angreifer kennt die hash-Ergebnis und das Salz, es ist sehr schwer zu erraten input:
Eingang + Salz => MD5 => Ausgabe
Den Grund für das hashing von Dateien ist die Berechnung einer Prüfsumme. E. g. veröffentlichen Sie eine Datei auf Ihrer web-Seite zusammen mit dem hash-Ergebnis. Benutzer dann eine Datei herunterlädt, läuft es durch MD5 und vergleicht das Ergebnis mit Ihrem Ergebnis veröffentlicht. Es würde sehr schwierig sein, zu manipulieren, mit der Datei ist, da jede manipulation zu einer Veränderung der resultierende hash.
Salzen ist hier nicht notwendig, da müsstest du veröffentlichen das Salz mit dem resultierenden hash-Werte, so dass der Benutzer wiederholen Sie den Hash-Vorgang.
Wenn Sie wirklich brauchen, um einzuführen, Salzen, ändern Sie einfach die input-Streams in die wiederholbare Art und Weise, z.B. um eine (mit überlauf) für jedes byte.
dies ist der richtige Weg, es zu tun:
Könnten Sie in Erwägung ziehen, die HMACMD5 Klasse und Einstellung der Schlüssel - Eigenschaft statt. Im Allgemeinen, würde ich gehen mit einem HMAC eher als die standard-hash-Funktion, denn Sie bieten eine etwas höhere Sicherheit.
Ich denke, Sie können verwenden Sie eine syntax wie:
Zu vermeiden, ziehen Sie die Datei in den Speicher, wie Dabblernl die Lösung, die Sie verwenden werden ein FileStream-wie besprochen wird in dieser Frage ALSO Computing MD5SUM von großen Dateien in C#, aber der MD5CryptoServiceProvider nicht erlauben Ihnen das hinzufügen von zusätzlichen Daten am Ende.
So benötigen Sie einen zusammengeführten stream wie diese:
Die Sie dann verwenden können, wie dieses Salz Sie Datei-hash
mit ToAnsiiBytes und PrintHash nur utility-Funktionen, wie Z:
und
wenn die Datei c:\text.txt enthält der text toto Sie können diesen code ausführen, um zu sehen, dass die Datei + Salz ist gleich der gleiche wie der text "totoSALT"
mit dieser Ausgabe