J’utilise iTextSharp pour lire le texte d’un fichier PDF. Cependant, il est parfois impossible d’extraire du texte, car le fichier PDF ne contient que des images. Je télécharge les mêmes fichiers PDF tous les jours et je veux voir si le PDF a été modifié. Si le texte et la date de modification ne peuvent pas être obtenus, une sum de contrôle MD5 est-elle le moyen le plus fiable de déterminer si le fichier a changé?
Si c’est le cas, certains exemples de code seraient appréciés, car je n’ai pas beaucoup d’expérience en cryptographie.
C’est très simple en utilisant System.Security.Cryptography.MD5 :
using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(filename)) { return md5.ComputeHash(stream); } }
(Je crois que la mise en œuvre du MD5 utilisée n’a pas besoin d’être éliminée, mais je le ferais probablement encore de toute façon.)
Comment vous comparez les résultats ensuite est à vous; Vous pouvez par exemple convertir le tableau d’octets en base64 ou comparer directement les octets. (Sachez simplement que les tableaux ne remplacent pas Equals
. L’utilisation de base64 est plus simple, mais légèrement moins efficace si vous ne souhaitez que comparer les hachages.)
Si vous devez représenter le hachage sous forme de chaîne, vous pouvez le convertir en hexadécimal à l’aide de BitConverter
:
static ssortingng CalculateMD5(ssortingng filename) { using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(filename)) { var hash = md5.ComputeHash(stream); return BitConverter.ToSsortingng(hash).Replace("-", "").ToLowerInvariant(); } } }
Voici comment je le fais:
using System.IO; using System.Security.Cryptography; public ssortingng checkMD5(ssortingng filename) { using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(filename)) { return Encoding.Default.GetSsortingng(md5.ComputeHash(stream)); } } }
Je sais que cette question a déjà été répondu, mais c’est ce que j’utilise:
using (FileStream fStream = File.OpenRead(filename)) { return GetHash(fStream) }
Où GetHash :
public static Ssortingng GetHash(Stream stream) where T : HashAlgorithm { SsortingngBuilder sb = new SsortingngBuilder(); 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.ToSsortingng("x2")); } } return sb.ToSsortingng(); }
Probablement pas le meilleur moyen, mais ça peut être pratique.
Voici une version légèrement plus simple que j’ai trouvée. Il lit l’intégralité du fichier en une seule fois et ne nécessite qu’une seule directive d’ using
.
byte[] ComputeHash(ssortingng filePath) { using (var md5 = MD5.Create()) { return md5.ComputeHash(File.ReadAllBytes(filePath)); } }
Et si vous avez besoin de calculer le MD5 pour voir s’il correspond au MD5 d’un blob Azure, cette question et cette réponse SO pourraient être utiles: