web-dev-qa-db-fra.com

Comment faire une somme de contrôle de fichier SHA1 en C #?

Comment utiliser la SHA1CryptoServiceProvider() sur un fichier pour créer une somme de contrôle SHA1 du fichier?

58
Firesteel
using (FileStream fs = new FileStream(@"C:\file\location", FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        byte[] hash = sha1.ComputeHash(bs);
        StringBuilder formatted = new StringBuilder(2 * hash.Length);
        foreach (byte b in hash)
        {
            formatted.AppendFormat("{0:X2}", b);
        }
    }
}

formatted contient la représentation sous forme de chaîne du hachage SHA-1. De plus, en utilisant un FileStream au lieu d'un tampon d'octets, ComputeHash calcule le hachage en morceaux, vous n'avez donc pas à charger le fichier entier en une seule fois, ce qui est utile pour les gros fichiers .

73
user153498

Avec la méthode ComputeHash. Vois ici:

ComputeHash

Exemple d'extrait:

using(var cryptoProvider = new SHA1CryptoServiceProvider())
{
    string hash = BitConverter
            .ToString(cryptoProvider.ComputeHash(buffer));

    //do something with hash
}

Où tampon correspond au contenu de votre fichier.

60
Ben Lakey

Si vous lisez déjà le fichier sous forme de flux, la technique suivante calcule le hachage lorsque vous le lisez. La seule mise en garde est que vous devez consommer tout le flux.

class Program
    {
        static void Main(string[] args)
        {
            String sourceFileName = "C:\\test.txt";
            Byte[] shaHash;

            //Use Sha1Managed if you really want sha1
            using (var shaForStream = new SHA256Managed())
            using (Stream sourceFileStream = File.Open(sourceFileName, FileMode.Open))
            using (Stream sourceStream = new CryptoStream(sourceFileStream, shaForStream, CryptoStreamMode.Read))
            {
                //Do something with the sourceStream 
                //NOTE You need to read all the bytes, otherwise you'll get an exception ({"Hash must be finalized before the hash value is retrieved."}) 
                while(sourceStream.ReadByte() != -1);                
                shaHash = shaForStream.Hash;
            }

            Console.WriteLine(Convert.ToBase64String(shaHash));
        }
    }
5
Daniel James Bryars

Vous pouvez également essayer:

FileStream fop = File.OpenRead(@"C:\test.bin");
string chksum = BitConverter.ToString(System.Security.Cryptography.SHA1.Create().ComputeHash(fop));
2
SNMetamorph