ハッシュ関数(正確には暗号学的ハッシュ関数)とは、入力の原形を止めないほど切り刻んで掻き混ぜて一定のサイズに要約する関数です。例えば 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