wiz.code

SHA-256の概要

メッセージダイジェストとは

SHA-256はメッセージダイジェスト(ハッシュ値とも言う)を得るための「一方向ハッシュ関数」の一種です。 いまさらこれを読んでいる方に「メッセージダイジェストとは何か」という話をするのも失礼かもしれませんが、プログラムを身につけるために読んでいる方もおられると思うので簡単に説明を。

メッセージダイジェストとは、何らかのデータ(入力データ)を元に算出して得られる一定の長さ(ビット長)を持つ値を指し「ハッシュ値」とも呼ばれます。 そして、メッセージダイジェスト(ハッシュ値)を生成する処理関数を「メッセージダイジェスト関数」あるいは「ハッシュ関数」と呼びます。 生成される値は乱数のように何の脈絡もない16進数の羅列であり、そこから変換前のデータを読み取ることは出来ません。

一見「暗号化」と同じように見えますが、暗号化しても復号化することはできない「不可逆暗号(一方通行の暗号化)」なので、 メッセージダイジェストだけを入手しても、元の値は得られません。 当然ながら、同じデータを元に算出すれば、必ず同じメッセージダイジェストが生成されます。 この一方向の変換という特性を利用し、ネットワーク通信によるデータ破損・改ざんのチェックや、パスワード認証・デジタル署名などに利用されています。

SHA-256のデータ長

SHA-256はその名前が示すとおり、256bit長のメッセージダイジェストを得ることができます。 これを16進数文字列で表記すると全部で64文字。 1バイトは16進数2文字に相当するので32Byteのデータ量となります。 MD5メッセージダイジェストと比べると、倍の長さの値を生成することができます。

入力データ
abc
MD5 - 128bit(16Byte)
90015098 3cd24fb0 d6963f7d 28e17f72
SHA-256 - 256bit(32Byte)
ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad

ハッシュ衝突

メッセージダイジェストのアルゴリズムを考える上で最も重要なのが「ハッシュ衝突」と呼ばれる現象です。 これは、異なるデータから同じハッシュ値が生成されてしまう事態を指します。 元のデータがどんな長さであっても、生成される値のビット長が決められている以上、絶対に衝突のないハッシュ関数は有り得ません。 ともあれ、ハッシュ値のビット長が長ければ長いほど、ハッシュ衝突は起こりにくくなります。

ハッシュ衝突の回避率はbitが1増えただけで2倍になるので、256bit長のハッシュ値は、128bit長のハッシュ値より2を128回掛けた分だけ、ハッシュ衝突の回避率が上がることなります。 逆に、ハッシュ衝突するデータを見つけるにはかなりの時間がかかることとなり、元データの割り出しは現在ではほぼ不可能とされています。 (MD5はアルゴリズムは、わずか数十分でハッシュ衝突するデータを発見する方法が発見されてしまい、MD5の利用を取り止める勧告が出されました。)

また、SHAアルゴリズムのシリーズには「SHA-512」という512bit長のハッシュ値を生成するハッシュアルゴリズムも定義されています。 当然512bit長の方が高いハッシュ強度を得られますが、SHA-512は64bitCPU向けに最適化されたアルゴリズムなので、今回は見合わせることにしました。

より詳しく知りたい方は「メッセージダイジェスト」「ハッシュ関数」などで検索してみてください。 次ページからいよいよアルゴリズム解説に入ります。