2012-11-26 4 views
12

berechnen Dies ist mein erstes C# -Projekt und ich bin fast Neuling. Ich benutze openfiledialoge für die Auswahl der Datei und holen Sie den Dateipfad von GetFullPath-Methode und speichern Sie es in einer Variablen namens fpath. Ich muss den Hash der Datei berechnen, dass sein Pfad in fpath Variable gespeichert ist. Ich denke, dass es über GetHashCode erfolgen kann. Kann mir jemand ein Schnipsel oder einen kleinen Führer geben?Wie soll ich Dateien Hash (MD5 & SHA1) in C#

Antwort

28
using (FileStream stream = File.OpenRead(file)) 
{ 
    SHA256Managed sha = new SHA256Managed(); 
    byte[] hash = sha.ComputeHash(stream); 
    return BitConverter.ToString(hash).Replace("-", String.Empty); 
} 
+1

Ich habe dies versucht, indem ich diese Nachricht erhalten: Der Typ oder Namespace-Name 'FileStream' konnte nicht gefunden werden. – n1kita

+6

Sie müssen System.io hinzufügen Namespace –

+3

Meiner Erfahrung nach ist 'SHA256CryptoServiceProvider' ziemlich viel schneller als' SHA256Managed'. Es ist normalerweise ein Tropfen im Ersatz. –

12

Hier einige Code, den ich zu einem anderen verwendet zu reagieren question auf SO

/// <summary> 
/// Gets a hash of the file using SHA1. 
/// </summary> 
/// <param name="filePath"></param> 
/// <returns></returns> 
public static string GetSHA1Hash(string filePath) 
{ 
    using (var sha1 = new SHA1CryptoServiceProvider()) 
     return GetHash(filePath, sha1); 
} 

/// <summary> 
/// Gets a hash of the file using SHA1. 
/// </summary> 
/// <param name="filePath"></param> 
/// <returns></returns> 
public static string GetSHA1Hash(Stream s) 
{ 
    using (var sha1 = new SHA1CryptoServiceProvider()) 
     return GetHash(s, sha1); 
} 

/// <summary> 
/// Gets a hash of the file using MD5. 
/// </summary> 
/// <param name="filePath"></param> 
/// <returns></returns> 
public static string GetMD5Hash(string filePath) 
{ 
    using (var md5 = new MD5CryptoServiceProvider()) 
     return GetHash(filePath, md5); 
} 

/// <summary> 
/// Gets a hash of the file using MD5. 
/// </summary> 
/// <param name="filePath"></param> 
/// <returns></returns> 
public static string GetMD5Hash(Stream s) 
{ 
    using (var md5 = new MD5CryptoServiceProvider()) 
     return GetHash(s, md5); 
} 

private static string GetHash(string filePath, HashAlgorithm hasher) 
{ 
    using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     return GetHash(fs, hasher); 
} 

private static string GetHash(Stream s, HashAlgorithm hasher) 
{ 
    var hash = hasher.ComputeHash(s); 
    var hashStr = Convert.ToBase64String(hash); 
    return hashStr.TrimEnd('='); 
} 
10

GetHashCode() ist standardmäßig nur für den internen Gebrauch, ob zwei Verweise auf ein Objekt zu überprüfen, sind in der Tat das gleiche Objekt. Die Implementierung des Gehörlosen-Hashes basiert auf der Stapel/Heap-Position und wird somit nicht zwischen den Programmläufen deterministisch sein (oder sogar zwei verschiedene Referenzen mit genau den gleichen Daten vergleichen). Daher sollte es nicht zum Berechnen von Prüfsummen verwendet werden.

.NET verfügt über eine Reihe von integrierten Bibliotheken, die diesen Zweck erfüllen; Sie befinden sich im System.Security.Cryptography-Namespace. Die beiden Sie sind die MD5 und SHA1-Klassen:

byte[] hashBytes; 
using(var inputFileStream = File.Open(filePath)) 
{ 
    var md5 = MD5.Create(); 
    hashBytes = md5.ComputeHash(inputFileStream); 
} 

Die SHA1 Klasse funktioniert auf die gleiche Art und Weise.

Ein Wort der Vorsicht; Sowohl MD5 als auch SHA1 werden als "fehlerhaft" betrachtet und sollten nicht in Systemen verwendet werden, die einen "sicheren" Hash benötigen. Erwägen Sie stattdessen, die SHA-256- oder SHA-512-Algorithmen im Gesamtsystem zu verwenden. Wenn Sie keinen sicheren Hashwert benötigen, gibt es schnellere Prüfsummen-Hashes wie FNV-1a oder MurmurHash, die eine gute Kollisionsresistenz bieten.

3

Hier ist ein vollständiger Code mit C# verwaltete Bibliothek, um den Hash zu berechnen.

using system.IO; 
using System.Security.Cryptography; 

public string GetSha1Hash(string filePath) 
{ 
    using (FileStream fs = File.OpenRead(filePath)) 
    { 
     SHA1 sha = new SHA1Managed(); 
     return BitConverter.ToString(sha.ComputeHash(fs)); 
    } 
}