web-dev-qa-db-ja.com

C#でファイルハッシュ(md5&SHA1)を計算するにはどうすればよいですか?

これは私の最初のC#プロジェクトであり、私はほとんど初心者です。 openfiledialogeを使用してファイルを選択し、GetFullPathメソッドでファイルパスを取得して、fpathなどの変数に格納します。パスがfpath変数に格納されているファイルのハッシュを計算する必要があります。GetHashCodeを介して実行できると思います。誰かが私にスニペットまたは小さなガイドをくれますか?

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

これは私が別の 質問 に応答するために使用したいくつかのコードです

/// <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('=');
}
13
Brian

GetHashCode()は、デフォルトでは、内部使用のみを目的としており、オブジェクトへの2つの参照が実際に同じオブジェクトであるかどうかを確認します。 deafultハッシュの実装はスタック/ヒープの場所に基づいているため、プログラムの実行間で決定論的ではありません(または、まったく同じデータを持つ2つの異なる参照を比較することさえありません)。したがって、チェックサムの計算には使用しないでください。

.NETには、この目的に役立つ一連の組み込みライブラリがあります。それらはSystem.Security.Cryptography名前空間にあります。必要な2つは、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などのより高速なチェックサムハッシュがあり、優れた衝突耐性を提供します。

10
KeithS

これは、C#マネージドライブラリを使用してハッシュを計算する完全なコードです。

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