セキュリティ

ハッシュ

GetHashCode()

オブジェクトの等値を判定するための関数で、すべての型が実装します。

public virtual int GetHashCode()
Object.GetHashCode メソッド (System) | MSDN

たとえばString.GetHashCode()は、その文字列を構成する文字から算出しています。GetHashCode - string.cs

このメソッドが返す値は.NET Frameworkのバージョンやプラットフォームなどによって異なり、永続的な値ではありません。 Remarks - Object.GetHashCode Method (System) | MSDN Remarks - String.GetHashCode Method (System) | MSDN

c# - Generate hash of object consistently - Stack Overflow

HashAlgorithm クラス

ハッシュ アルゴリズムを実装するクラスの基本クラスです。

  • System.Object
    • System.Security.Cryptography.HashAlgorithm
      • System.Security.Cryptography.KeyedHashAlgorithm
        • System.Security.Cryptography.HMAC
        • System.Security.Cryptography.MACTripleDES
      • System.Security.Cryptography.MD5
        • System.Security.Cryptography.MD5Cng … CNG (Cryptography Next Generation) 実装
        • System.Security.Cryptography.MD5CryptoServiceProvider … Cryptographic Service Provider (CSP) 実装
      • System.Security.Cryptography.RIPEMD160
        • System.Security.Cryptography.RIPEMD160Managed
      • System.Security.Cryptography.SHA1
        • System.Security.Cryptography.SHA1Cng
        • System.Security.Cryptography.SHA1CryptoServiceProvider
        • System.Security.Cryptography.SHA1Managed
      • System.Security.Cryptography.SHA256
        • System.Security.Cryptography.SHA256Cng
        • System.Security.Cryptography.SHA256CryptoServiceProvider
        • System.Security.Cryptography.SHA256Managed
      • System.Security.Cryptography.SHA384
        • System.Security.Cryptography.SHA384Cng
        • System.Security.Cryptography.SHA384CryptoServiceProvider
        • System.Security.Cryptography.SHA384Managed
      • System.Security.Cryptography.SHA512
        • System.Security.Cryptography.SHA512Cng
        • System.Security.Cryptography.SHA512CryptoServiceProvider
        • System.Security.Cryptography.SHA512Managed

ComputeHash()

public byte[] ComputeHash(
    byte[] buffer
)
HashAlgorithm.ComputeHash メソッド (Byte[]) (System.Security.Cryptography) | MSDN
byte[] buffer = new byte[1000 * 1000 * 500]; // 500[MB]

Random rand = new Random(0);
rand.NextBytes(buffer);

int b = buffer.GetHashCode(); // 1, 1[msec] … 2回の試行の実行時間

byte[] m1 = MD5.Create().ComputeHash(buffer);                   // 1086, 1112
byte[] m2 = new MD5Cng().ComputeHash(buffer);                   // 1305, 1287
byte[] m3 = new MD5CryptoServiceProvider().ComputeHash(buffer); // 1080, 1085

byte[] r1 = RIPEMD160.Create().ComputeHash(buffer);     // 6556, 6543
byte[] r2 = new RIPEMD160Managed().ComputeHash(buffer); // 6588, 6574

byte[] s1 = SHA1.Create().ComputeHash(buffer);                   // 1578, 1611
byte[] s2 = new SHA1Cng().ComputeHash(buffer);                   // 1797, 1804
byte[] s3 = new SHA1CryptoServiceProvider().ComputeHash(buffer); // 1598, 1587
byte[] s4 = new SHA1Managed().ComputeHash(buffer);               // 3256, 3179

byte[] ss1 = SHA256.Create().ComputeHash(buffer);                   // 5878, 6071
byte[] ss2 = new SHA256Cng().ComputeHash(buffer);                   // 3358, 3374
byte[] ss3 = new SHA256CryptoServiceProvider().ComputeHash(buffer); // 3386, 3407
byte[] ss4 = new SHA256Managed().ComputeHash(buffer);               // 6243, 6151

MD5 クラス

MD5ハッシュ アルゴリズムの実装を表す抽象クラスです。

MD5とSHA1は衝突の問題 (collision problems) によりSHA256やSHA512を使用することが推奨されており、MD5は互換性のために残されています。Remarks - MD5 Class (System.Security.Cryptography) | Microsoft Learn

using (HashAlgorithm algorithm = MD5.Create())
{
    string input = "Hello World!";
    byte[] hashCode = algorithm.ComputeHash(Encoding.UTF8.GetBytes(input));
    // 237, 7, 98, 135, 83, 46, 134, 54, 94, 132, 30, 146, 191, 197, 13, 140

    // ハッシュ コードを16進の文字列へ変換
    string hash = BitConverter.ToString(hashCode).Replace("-", "");
    // ED076287532E86365E841E92BFC50D8C
}
MD5 クラス (System.Security.Cryptography) | Microsoft Learn

インスタンスはMD5.Create()により作成でき、このとき指定可能な次の値です。Create(String) - MD5.Create メソッド (System.Security.Cryptography) | Microsoft Learn

  • MD5
  • System.Security.Cryptography.MD5
  • System.Security.Cryptography.MD5CryptoServiceProvider
  • System.Security.Cryptography.MD5Managed

これを省略すると"System.Security.Cryptography.MD5"が指定されます。Create - md5.cs

ファイルのハッシュを求めるには、次のようにストリームを受け取るオーバーロードを用います。

using (HashAlgorithm algorithm = MD5.Create())
using (FileStream fs = new FileStream(path, FileMode.Open))
{
    byte[] hashCode = algorithm.ComputeHash(fs);
}

CRC

xxHash

Data.HashFunction.xxHash

using System.Data.HashFunction;

xxHash xxHash32 = new xxHash(32); // ハッシュサイズ:32bit
byte[] result32 = xxHash32.ComputeHash(data);

xxHash xxHash64 = new xxHash(64); // ハッシュサイズ:64bit
byte[] result64 = xxHash64.ComputeHash(data)
Microsoft Learnから検索