Calcola il checksum MD5 per un file

Sto usando iTextSharp per leggere il testo da un file PDF. Tuttavia, ci sono volte in cui non riesco a estrarre il testo, perché il file PDF contiene solo immagini. Scarico gli stessi file PDF ogni giorno e voglio vedere se il PDF è stato modificato. Se il testo e la data di modifica non possono essere ottenuti, il checksum MD5 è il modo più affidabile per stabilire se il file è stato modificato?

Se lo è, alcuni esempi di codice sarebbero apprezzati, perché non ho molta esperienza con la crittografia.

È molto semplice utilizzare System.Security.Cryptography.MD5 :

using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(filename)) { return md5.ComputeHash(stream); } } 

(Credo che in realtà l’implementazione MD5 utilizzata non abbia bisogno di essere smaltita, ma probabilmente lo farei comunque comunque.)

Come confrontare i risultati dopo dipende da voi; per esempio puoi convertire l’array di byte in base64 o confrontare direttamente i byte. (Ricorda che gli array non hanno la precedenza su Equals . L’uso di base64 è più semplice per essere corretto, ma leggermente meno efficiente se sei davvero interessato solo a confrontare gli hash.)

Se devi rappresentare l’hash come una stringa, puoi convertirlo in esadecimale usando BitConverter :

 static string CalculateMD5(string filename) { using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(filename)) { var hash = md5.ComputeHash(stream); return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); } } } 

Ecco come lo faccio:

 using System.IO; using System.Security.Cryptography; public string checkMD5(string filename) { using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(filename)) { return Encoding.Default.GetString(md5.ComputeHash(stream)); } } } 

So che questa domanda ha già avuto risposta, ma questo è quello che uso:

 using (FileStream fStream = File.OpenRead(filename)) { return GetHash(fStream) } 

Dove GetHash :

 public static String GetHash(Stream stream) where T : HashAlgorithm { StringBuilder sb = new StringBuilder(); MethodInfo create = typeof(T).GetMethod("Create", new Type[] {}); using (T crypt = (T) create.Invoke(null, null)) { byte[] hashBytes = crypt.ComputeHash(stream); foreach (byte bt in hashBytes) { sb.Append(bt.ToString("x2")); } } return sb.ToString(); } 

Probabilmente non è il modo migliore, ma può essere utile.

Ecco una versione leggermente più semplice che ho trovato. Legge l’intero file in una volta sola e richiede solo una singola direttiva.

 byte[] ComputeHash(string filePath) { using (var md5 = MD5.Create()) { return md5.ComputeHash(File.ReadAllBytes(filePath)); } } 

E se hai bisogno di calcolare l’MD5 per vedere se corrisponde all’MD5 di un BLOB di Azure, allora questa domanda e risposta di SO potrebbe essere utile: l’ hash MD5 di blob caricato su Azure non corrisponde allo stesso file sulla macchina locale