2012-11-26 12 views
12

Questo è il mio primo progetto in C# e sono quasi un principiante. Io uso openfiledialoge per selezionare il file e ottenere il percorso file dal metodo GetFullPath e memorizzarlo in una variabile chiamata ad esempio fpath. Ho bisogno di calcolare l'hash del file che il suo percorso è memorizzato nella variabile fpath. Penso che possa essere fatto tramite GetHashCode. Qualcuno può darmi un frammento o una piccola guida?Come devo calcolare i file hash (md5 e SHA1) in C#

risposta

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

Ho provato questo da Ho ricevuto questo messaggio: Impossibile trovare il tipo o il nome dello spazio dei nomi 'FileStream'. – n1kita

+6

è necessario aggiungere lo spazio dei nomi system.io –

+3

Nella mia esperienza, 'SHA256CryptoServiceProvider' è un po 'più veloce di' SHA256Managed'. Di solito è una goccia in sostituzione. –

12

Ecco alcuni codice che ho usato per rispondere a un'altra question su 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() è, per impostazione predefinita, per uso interno, per verificare se due riferimenti a un oggetto sono infatti lo stesso oggetto. L'implementazione dell'hash di deafult si basa sulla posizione stack/heap e quindi non sarà deterministica tra le esecuzioni del programma (o addirittura confrontando due diversi riferimenti con esattamente gli stessi dati). Quindi, non dovrebbe essere usato per calcolare i checksum.

.NET ha una matrice di librerie incorporate che servono a questo scopo; sono nello spazio dei nomi System.Security.Cryptography. I due si desidera sono le classi MD5 e SHA1:

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

La classe SHA1 funziona allo stesso modo.

Una parola di cautela; sia MD5 che SHA1 sono considerati "interrotti" e non dovrebbero essere usati in nessun sistema che richiede un hash "sicuro". Prendi in considerazione l'utilizzo degli algoritmi SHA-256 o SHA-512 nel sistema generale. Se non hai bisogno di un hash sicuro, ci sono hash più veloci del checksum come FNV-1a o MurmurHash che forniscono una buona resistenza alle collisioni.

3

Ecco un codice completo che utilizza la libreria gestita C# per calcolare l'hash.

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)); 
    } 
} 
Problemi correlati