Подтвердить что ты не робот

Как вычислить хэш файлы (md5 & SHA1) в С#

Это мой первый проект С#, и я почти новичок. Я использую openfiledialoge для выбора файла и получаю путь к файлу методом GetFullPath и сохраняю его в переменной, называемой, например, fpath. Мне нужно вычислить хэш файла, что его путь хранится в переменной fpath. Я думаю, что это можно сделать через GetHashCode. Может ли кто-нибудь дать мне фрагмент или небольшой путеводитель?

4b9b3361

Ответ 1

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

Ответ 2

Вот код, который я использовал для ответа на другой вопрос на 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('=');
}

Ответ 3

GetHashCode() по умолчанию используется только для внутреннего использования, чтобы проверить, являются ли две ссылки на объект фактически одним и тем же объектом. Реализация хеширования deafult основана на расположении стека/кучи и, следовательно, не будет детерминированной между прогонами программы (или даже сравнением двух разных ссылок с точно такими же данными). Поэтому он не должен использоваться для вычисления контрольных сумм.

.NET имеет массив встроенных библиотек, которые служат этой цели; они находятся в пространстве имен System.Security.Cryptography. Два из них - это классы MD5 и SHA1:

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

Класс SHA1 работает одинаково.

Слово предостережения; как MD5, так и SHA1 считаются "сломанными" и не должны использоваться в любой системе, требующей "безопасного" хэша. Вместо этого рассмотрите использование алгоритмов SHA-256 или SHA-512 в общей системе. Если вам не нужен безопасный хэш, есть более быстрые хэши контрольной суммы, такие как FNV-1a или MurmurHash, которые обеспечат хорошее сопротивление столкновению.

Ответ 4

Вот полный код с использованием управляемой библиотеки С# для вычисления хэша.

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