ハッシュ関数

ハッシュ関数(正確には暗号学的ハッシュ関数)とは、入力の原形を止めないほど切り刻んで掻き混ぜて一定のサイズに要約する関数です。例えば MD5(エムディーファイブ)というハッシュ関数は、どんな入力でも128ビット(16バイト)に要約します。切り刻んで掻き混ぜるやりかたが非常に複雑なため、ハッシュ関数の逆関数をプログラムの形で書き下すことはできません(ハッシュ関数は多対1の関数で、逆関数は1対多の多価関数です)。つまり、ハッシュ関数は、陽な逆関数が存在しない「一方向関数」です。

ある入力に対するハッシュ関数の値をハッシュ値といいます。上に述べたように、与えられたハッシュ値に対応する元の入力を求める簡単な方法はありません。与えられたハッシュ値になるまで、あらゆる入力を試してみる、という手段(ブルートフォース)しかありません。

Windowsでは CertUtil というツールでハッシュが計算できます。コマンドプロンプトやPowerShellで

certutil -hashfile ファイル名 ハッシュアルゴリズム

のように打ち込んで使います。ハッシュアルゴリズムは MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512 が指定できます。

中身が「hoge」という4文字(4バイト、16進 68 6f 67 65)のテキストファイル hoge.txt を用意して、試してみましょう:

certutil -hashfile hoge.txt MD5

次のように表示されます:

MD5 ハッシュ (対象 hoge.txt):
ea703e7aa1efda0064eaa507d9e8ab7e
CertUtil: -hashfile コマンドは正常に完了しました。

これは hoge.txt というファイルのMD5の値が16進で ea703e7aa1efda0064eaa507d9e8ab7e であることを意味します。16進32桁ですので、128ビットです。

MacやLinuxでは「hoge」という4文字のファイル hoge.txt を作るには echo -n hoge >hoge.txt と打ち込みます。echo -n hoge は標準出力に「hoge」の4バイトを出力します。echo hoge だけでは改行コードが付いて「hoge改行」(16進 68 6f 67 65 0a)になります。ちなみに、Windowsのコマンドプロンプトで echo hoge とすると16進 68 6f 67 65 0d 0a のように出力されます。PowerShellで echo hoge とするとUTF-16LEで ff fe 68 00 6f 00 67 00 65 00 0d 00 0a 00 と出力されます。

128ビットのMD5は、もはや太古のものです。今は推奨されません。160ビットのSHA-1(シャーワン)ももう古く、今は256ビットのSHA-256や、512ビットのSHA-512がよく使われます。

Macでは md5 および shasum というコマンドが使えます。SHA-256を求めるには shasum -a 256 とします。

% md5 hoge.txt
MD5 (hoge.txt) = ea703e7aa1efda0064eaa507d9e8ab7e
% shasum -a 256 hoge.txt
ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825  hoge.txt

Linux(WindowsのWSLのUbuntuなども含む)や、MacでHomebrewをインストールした場合は、md5sum sha1sum sha224sum sha256sum sha384sum sha512sum shasum が使えます。

$ md5sum hoge.txt 
ea703e7aa1efda0064eaa507d9e8ab7e  hoge.txt
$ sha256sum hoge.txt 
ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825  hoge.txt