[C#] シンプルにMD5やSHA256などでハッシュ値を計算し文字列として取得する


はじめに

テキストやファイルが改ざんされていないかをチェックするのに適しているハッシュ値ですが、このハッシュ値の計算に関して、C#のSystem.Security.Cryptography 名前空間で、データの暗号化アルゴリズムが提供されています。

今回は、以下の5つの暗号化アルゴリズムを利用して、ハッシュ値を計算する方法の備忘録です。

  • MD5(128bits=16bytes)
  • SHA1(160bits=20bytes)
  • SHA256(256bits=32bytes)
  • SHA384(384bits=48bytes)
  • SHA512(512bits=64bytes)

なお、現在では、電子政府推奨暗号リストにはMD5は入っておらず、SHA1やRIPEMD-160も注釈として「256ビット以上のハッシュ関数を選択することが望ましい」となっています。

脆弱性や安全性の問題から使用は推奨されていませんので、用途を考慮した上でご利用ください。

 

テストコード

/// <summary>
/// ハッシュ値を計算するプログラムサンプルクラス
/// </summary>
class HashCryptography
{

    private static readonly MD5CryptoServiceProvider md5CrptProvider = new MD5CryptoServiceProvider();
    private static readonly SHA1CryptoServiceProvider sha1CrptProcider = new SHA1CryptoServiceProvider();
    private static readonly SHA256CryptoServiceProvider sha256CrptProvider = new SHA256CryptoServiceProvider();
    private static readonly SHA384CryptoServiceProvider sha384CrptProvider = new SHA384CryptoServiceProvider();
    private static readonly SHA512CryptoServiceProvider sha512CrptProvider = new SHA512CryptoServiceProvider();

    /// <summary>
    /// MD5ハッシュ値を計算し取得する
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetMd5HashedString(string value)
        => string.Join("", md5CrptProvider.ComputeHash(Encoding.UTF8.GetBytes($"{value}")).Select(s => $"{s:x2}"));

    /// <summary>
    /// SHA1ハッシュ値を計算し取得する
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetSha1HashedString(string value)
        => string.Join("", sha1CrptProcider.ComputeHash(Encoding.UTF8.GetBytes($"{value}")).Select(s => $"{s:x2}"));

    /// <summary>
    /// SHA256ハッシュ値を計算し取得する
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetSha256HashedString(string value)
        => string.Join("", sha256CrptProvider.ComputeHash(Encoding.UTF8.GetBytes($"{value}")).Select(s => $"{s:x2}"));

    /// <summary>
    /// SHA384ハッシュ値を計算し取得する
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetSha384HashedString(string value)
        => string.Join("", sha384CrptProvider.ComputeHash(Encoding.UTF8.GetBytes($"{value}")).Select(s => $"{s:x2}"));

    /// <summary>
    /// SHA512ハッシュ値を計算し取得する
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetSha512HashedString(string value)
        => string.Join("", sha512CrptProvider.ComputeHash(Encoding.UTF8.GetBytes($"{value}")).Select(s => $"{s:x2}"));

}

 

利用方法

先ほど作成したテストコードの利用方法は下記の通りです。

static void Main(string[] args)
{
    Console.WriteLine($"MD5 : {HashCryptography.GetMd5HashedString("sample")}");
    Console.WriteLine($"SHA1 : {HashCryptography.GetSha1HashedString("sample")}");
    Console.WriteLine($"SHA256 : {HashCryptography.GetSha256HashedString("sample")}");
    Console.WriteLine($"SHA384 : {HashCryptography.GetSha384HashedString("sample")}");
    Console.WriteLine($"SHA512 : {HashCryptography.GetSha512HashedString("sample")}");
}

上記を実行した結果は下記となります。

MD5 : 5e8ff9bf55ba3508199d22e984129be6
SHA1 : 8151325dcdbae9e0ff95f9f9658432dbedfdb209
SHA256 : af2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268e9891562113d8a62add1bf
SHA384 : 9a9083505bc92276aec4be312696ef7bf3bf603f4bbd381196a029f340585312313bca4a9b5b890efee42c77b1ee25fe
SHA512 : 39a5e04aaff7455d9850c605364f514c11324ce64016960d23d5dc57d3ffd8f49a739468ab8049bf18eef820cdb1ad6c9015f838556bc7fad4138b23fdf986c7

 

最後に

ハッシュ値の計算は結構使うことが多いので、シンプルにクラス化して使えるようにしておくと良いと思います。

 

参考