[C#] ハッシュ値を計算する方法

[C#] ハッシュ値を計算する方法

ハッシュ値を計算する方法

ハッシュ値とは

ハッシュ値とは、元になるデータから一定の計算手順(ハッシュ関数)によって求められた、規則性のない固定長の値のことです。同じ元データから得られるハッシュ値は同一で、ハッシュ値から元データの復元はできません。

ハッシュアルゴリズムの種類

MD5

  • MD5(エムディーファイブ、Message Digest Algorithm 5)
  • 与えられた入力に対して128ビットのハッシュ値を出力するハッシュ関数
  • アメリカ合衆国政府では、MD5ではなく、Secure Hash Algorithm (SHA)を標準のハッシュとして使用している
  • 日本のCRYPTRECでは、MD5を政府推奨暗号リストから外し、SHA-256以上を推奨している

SHA

  • Secure Hash Algorithm(セキュアハッシュアルゴリズム)、略称SHA(エスエイチエー、シャー)
  • アメリカ政府標準のハッシュ関数 Secure Hash Standard (SHS) として採用されている
  • SHAには4種類のシリーズが存在し、それぞれSHA-0、SHA-1SHA-2SHA-3と呼ばれる
  • SSL、SSH等で用いられる暗号化アルゴリズムだが、SHA-0とSHA-1には脆弱性発見指摘されており、SHA-2への以降が進んでいる

C#でのハッシュ値計算方法

MD5を計算するサンプル

public static string GetMD5HashString(string text)
{
    // 文字列をバイト型配列に変換する
    byte[] data = Encoding.UTF8.GetBytes(text);

    // MD5ハッシュアルゴリズム生成
    var algorithm = new MD5CryptoServiceProvider();

    // ハッシュ値を計算する
    byte[] bs = algorithm.ComputeHash(data);

    // リソースを解放する
    algorithm.Clear();

    // バイト型配列を16進数文字列に変換
    var result = new StringBuilder();
    foreach (byte b in bs)
    {
        result.Append(b.ToString("X2"));
    }
    return result.ToString();
}

.NET Frameworkで利用できるハッシュ・アルゴリズム

.NET Frameworkでは主に次の6つのハッシュ・アルゴリズムが利用できます。また同名のクラスがSystem.Security.Cryptography名前空間に定義されており、ComputeHashメソッドでそれぞれのアルゴリズムでのハッシュ値を計算できます。

  • MD5
  • SHA1
  • SHA256
  • SHA384
  • SHA512
  • RIPEMD160

ただしこれらのクラスは抽象クラスであり、アルゴリズムの実装は以下の派生クラスで行われています。実装クラスをインスタンス化し、ComputeHashを呼び出せばハッシュ値の計算が可能です。上のコード例では、MD5CryptoServiceProviderを使って、引数の文字列から求められるMD5のハッシュ値を計算するメソッドです。同様に各種アルゴリズムでのハッシュ値計算も可能です。

  • MD5CryptoServiceProvider
  • SHA1CryptoServiceProvider
  • SHA256CryptoServiceProvider
  • SHA384CryptoServiceProvider
  • SHA512CryptoServiceProvider

すべてのハッシュアルゴリズムに対応するメソッド

型引数で、HashAlgorithm を指定し、ハッシュ値を計算できる共通メソッドを定義できます。

using System;
using System.Security.Cryptography;
using System.Text;

public class Program
{
    public static void Main(string[] args)
    {
        var key = "test";
        var md5 = GetHashString<MD5CryptoServiceProvider>(key);
        var sha1 = GetHashString<SHA1CryptoServiceProvider>(key);
        var sha256 = GetHashString<SHA256CryptoServiceProvider>(key);
        var sha512 = GetHashString<SHA512CryptoServiceProvider>(key);
        Console.WriteLine(md5);
        Console.WriteLine(sha1);
        Console.WriteLine(sha256);
        Console.WriteLine(sha512);
    }

    public static string GetHashString<T>(string text) where T : HashAlgorithm, new()
    {
        // 文字列をバイト型配列に変換する
        byte[] data = Encoding.UTF8.GetBytes(text);

        // ハッシュアルゴリズム生成
        var algorithm = new T();

        // ハッシュ値を計算する
        byte[] bs = algorithm.ComputeHash(data);

        // リソースを解放する
        algorithm.Clear();

        // バイト型配列を16進数文字列に変換
        var result = new StringBuilder();
        foreach (byte b in bs)
        {
            result.Append(b.ToString("X2"));
        }
        return result.ToString();
    }
}

参考URL

C#カテゴリの最新記事