読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

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

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

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

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

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

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

Windowsストアアプリには、System.Security.Cryptography名前空間が存在しません。

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

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

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

次にハッシュ化をおこなうメソッドです。

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

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

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

このComputeSHA1Hashメソッドの使い方は以下の通りです。

var sha1 = ComputeSHA1Hash("CH3COOH");
// Result: baa44006e5e94bd226df8b898ec921436bfe42f5

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