【C#】文字列やファイルのハッシュ値を求める

C#ハッシュ値を計算する方法のまとめです。

ハッシュ値とは?

ハッシュ値とは文字列やファイルなどの同一性を検証するための値です。
全く同一の文字列/ファイルであれば全く同じハッシュ値となりますが、
文字列/ファイルの内容が少しでも異なればハッシュ値は全然別のものとなります。

具体的な用途として、例えばいまユーザが設定したパスワードをDBに保存することを考えます。
パスワードを平文のまま保存するのはセキュリティ的な観点からよくないので、パスワード文字列のハッシュ値を計算して保存しておきます。

次回このユーザがパスワードを入力したとき、この入力されたパスワードのハッシュ値とDBに保存されているハッシュ値を比較して同一であれば正しいパスワードと判定できます。
また誤ったパスワードが入力された場合にはハッシュ値も異なるのでパスワードが不正であると判定できます。

ちなみにハッシュ値の算出アルゴリズムにはMD5SHA-1、SHA-2などいくつかの種類があります。
本記事での説明は割愛しますが、以下の記事で詳しく紹介されています。

www.atmarkit.co.jp

文字列のハッシュ値を計算する

文字列のハッシュ値を求めるにはMD5CryptoServiceProviderなどのクラスを使います。

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

public class Example
{
    private void Main()
    {
        // 対象の文字列とそれをバイト配列に変換したもの
        var targetStr = "example";
        var targetBytes = Encoding.UTF8.GetBytes(targetStr);

        // MD5ハッシュを計算
        var csp = new MD5CryptoServiceProvider();
        var hashBytes = csp.ComputeHash(targetBytes);

        // バイト配列を文字列に変換
        var hashStr = new StringBuilder();
        foreach (var hashByte in hashBytes) {
            hashStr.Append(hashByte.ToString("x2"));
        }

        Console.WriteLine(hashStr);
    }
}

MD5以外のアルゴリズムを使いたければ、SHA256CryptoServiceProviderなどのクラスが用意されているのでこれらを使えばOKです。

ファイルのハッシュ値を計算する

ファイルのハッシュを計算するには、CryptoServiceProviderにバイト配列を渡す代わりにFileStreamを渡します。

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

public class Example
{
    private void Main()
    {
        // 対象のファイルのFileStreamを取得
        var filepath = @"C:\Users\UserName\Desktop\example.png";
        var filestream = new FileStream(filepath, FileMode.Open);

        // MD5ハッシュを計算
        var csp = new MD5CryptoServiceProvider();
        var hashBytes = csp.ComputeHash(filestream);

        // バイト配列を文字列に変換
        var hashStr = new StringBuilder();
        foreach (var hashByte in hashBytes) {
            hashStr.Append(hashByte.ToString("x2"));
        }

        Console.WriteLine(hashStr);
    }
}

ソルトを付与して安全性を高める

パスワードのハッシュ値を前述のようにDBに保存するような方法は、実はセキュリティの観点から問題があります。

この問題を解決するためのソルトを付与するという方法があります。
これについては以下の記事で解説しているので、必要に応じて参照してください。

light11.hatenadiary.com

参考

dobon.net

dobon.net