酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

WindowsストアアプリでMD5のハッシュ値を計算する

MD5(Message Digest Algorithm 5)は、入力に対して128ビットのハッシュ値を出力するハッシュ関数のことで、不可逆的な一方関数を用いているところから認証などで広く使われています。他にもダウンロードしたファイルが第三者によって作者(配布者)が意図しない改竄がおこなわれていないかの調査に使用することもあります。

同じくMetro スタイル アプリにてSHA1のハッシュアルゴリズムを使用してハッシュ値を得たい場合には、こちらのMetro スタイル アプリでSHA1のハッシュ値を計算するをご参照ください。

本記事では、Metro スタイル アプリでMD5のハッシュ値を得るためにはどうすれば良いのかご紹介します。

デスクトップWindowsでMD5のハッシュ値を取得する

デスクトップWindowsでは、以下のサンプルコードの通りシンプルにハッシュ値を得ることができています。

var md5 = System.Security.Cryptography.MD5.Create();
var hash = md5.ComputeHash(input);

Metro スタイル アプリでMD5のハッシュ値を取得する

Metro スタイル アプリではSystem.Security.Cryptography名前空間が存在しないため、代わりとなるWindows.Security.Cryptography名前空間のクラスを使用します。デスクトップWindowsと比較して少し手順が増えましたが、数多くのハッシュアルゴリズムを汎用的に扱えるようになっています。

usingディレクティブに以下の名前空間を定義してください。

using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;

次にハッシュ化をおこなうメソッドです。HashAlgorithmProviderクラスのOpenAlgorithmメソッドに使用したいアルゴリズムの名前を入力します(ここではMD5を指定)。CryptographicBuffer.ConvertStringToBinaryメソッドを使用し、入力された文字列を事前にバッファへ変換しておきます。

バッファに格納されたデータをalgorithmのHashDataメソッドを使用してハッシュ化します。ハッシュ化されたデータをCryptographicBuffer.EncodeToHexStringメソッドで扱いやすい16進数の文字列へ変換しています。

string ComputeMD5Hash(string input)
{
    // MD5のハッシュプロバイダーを取得する
    var algorithm = HashAlgorithmProvider.OpenAlgorithm("MD5");
    // 暗号前の文字列をバイナリ形式のバッファに変換する
    IBuffer buffer = CryptographicBuffer.ConvertStringToBinary(input, BinaryStringEncoding.Utf8);
    // バッファからハッシュ化されたデータを取得する
    var hash = algorithm.HashData(buffer);
    // ハッシュ化されたデータを16進数の文字列へ変換
    return CryptographicBuffer.EncodeToHexString(hash);
}

このComputeMD5Hashメソッドの使い方は以下の通りです。この値が正しいかどうかはオンラインのハッシュ変換サイトを使って検証することができます。

var md5 = ComputeMD5Hash("CH3COOH");
// 結果: e69e27380a0146e24533c9ea5bbf1e86