ハッシュ関数
ハッシュ関数(暗号学的ハッシュ関数)は,入力データに対して暗号変換に似た処理(攪拌処理)を繰り返し施すことにより一定長(128~512ビット程度)のデータになるように入力データを圧縮する関数である. メッセージダイジェストやフィンガープリントとも呼ばれる.
ハッシュ値の計算は比較的単純であり,共通鍵暗号に比べて処理が数十~数百倍以上も速い.このため,ハッシュ関数は以下に示すように情報セキュリティシステムの各所で用いられている.
- コンピュータのハードディスク上に生のパスワー ドを保存する場合,そのままでは危険なため,パスワードのハッシュ値を保存する. ログイン時のパスワードからハッシュ関数によりハッシュ値を計算し保存されている値と比較する.
- 乱数データを生成するために,幾つかの初期データをハッシュ関数に入力しデータを攪拌する.
- ディジタル署名を生成する際の前処理として署名対象データを一定の長さに圧縮したり,相手認証を行なう場合の認証子の生成などに利用する.
ハッシュ関数を使ってメッセージを一定長に圧縮してから署名(認証子)を生成すると,署名対象データの長さはいつも一定になり,署名の生成処理時間もメッセージ長に依存しないため好都合である.
これらの利用において,異なるメッセージから同じハッシュ値を生成することが実質上ないハッシュ関数を用いることが重要である.さもないと,メッセージの偽造の可能性が高まることになる.そのため,このハッシュ関数はコリジョン・フリー(collision-free)であることが要求される.
コリジョン・フリーとはそのハッシュ関数により同じハッシュ値に圧縮されるメッセージを見つけることが困難であるということである.
すなわち,ハッシュ関数 h は次の条件を満たすことが必要である.
- 一方向性(One-way)
z が与えられたとき,h (x) = z になる x を見つけるのが困難であること.
- コリジョンフリー(Collision-free)
- weakly collision-free
x が与えられた時,h (x) = h (x') なる x'(x ≠ x') を見つけるのが困難であること.
- strongly collision-free
h (x) = h(x') かつ x ≠ x' なる x, x' を見つけるのが困難であること.
ハッシュ関数には,入力データの変換処理にブロック暗号を用いる方法と換字と置換を繰り返す専用のアルゴリズムを用いる方法とがある. 前者の方法は ISO-10118-2 で標準化されているが,ブロック暗号として何を用いるかは規定されていない. 後者の代表的なハッシュ関数には,以下に示す MD5 や SHA-1 などがある.
- MD5
MD5 はこれまで最も多く使われてきたと思われるハッシュ関数で,そのアルゴリズムは RFC1321(The MD5 Message-Digest Algorithm) に規定されている.MD5 は128ビットのメッセージダイジェストを出力する高速なアルゴリズムで,特に32ビットマシンを対象に設計されている.実際,アルゴリズムのなかで32ビットを単位とする演算(mod 232addition, 32bit-rotating) が多く使われている. しかし,安全性の向上のため160ビット以上のハッシュ長を求めるられることもあり,最近は
MD5 よりも SHA-1 や SHA-2 が使われることが多い.
- SHA-1
SHA-1 は米国商務省の標準化機関NISTが規定した SHS(Secure Hash Standard)として定めたハッシュ関数であり,米国政府の規格(FIPS)として採用されたものである.
SHA-1 の安全性は MD5 より高いと言われているが,性能は 25% 程低い.
SHA-1 のアルゴリズムの詳細については,ダイジェストアルゴリズムを参照.
- SHA-2
SHA-1 の後継として,NISTが規定した米国政府標準ハッシュ関数である(FIPS 180-2).SHA-224,SHA-256,SHA-384,SHA-512が規格化されている.ハッシュ長は順に224ビット,256ビット,384ビット,512ビットである.
これらのハッシュ関数は,ハッシュ長の違いよりむしろ利用環境でのCPU基本演算系の違いを意識したものである.32ビット演算系での利用を前提とする場合には SHA-224 と SHA-256 を,64ビット演算での利用を前提とする場合には SHA-384 と SHA-512 を使うことが想定されている(SHA-256 は32ビット単位の処理,SHA-512 は64ビット単位の処理). SHA-224 と SHA-384 は,それぞれ SHA-256 または SHA-512 と同様の演算をした後に,それらのハッシュ値の一部(下位32ビットまたは128ビット)を切り捨てる形でハッシュ長を短くしている.
そのため,処理性能的には SHA-224 と SHA-256,SHA-384 と SHA-512 はそれぞれ同等である.
なお,FIPS 180-4 において,SHA-512/224 と SHA-512/256 が追加された.
- SHA-3 (→ SHA-3 アルゴリズム)
主なハッシュ関数を次の表に示す.
ハッシュ関数
ハッシュ関数 |
ハッシュ長(bit) |
備考 |
MD2 |
128 |
RFC 1319 |
MD4 |
128 |
RFC 1320 |
MD5 |
128 |
RFC 1321 |
RIPE-MD128 |
128 |
|
RIPE-MD160 |
160 |
|
SHA-1 |
160 |
FIPS 180-2 |
SHA-224 |
224 |
FIPS 180-2 |
SHA-256 |
256 |
FIPS 180-2 |
SHA-384 |
384 |
FIPS 180-2 |
SHA-512 |
512 |
FIPS 180-2 |
SHA-512/224 |
224 |
FIPS 180-4 |
SHA-512/256 |
256 |
FIPS 180-4 |
また,電子政府推奨暗号リストでは,以下のハッシュ関数が推奨されている.
- RIPEMD-160(注1)
- SHA-1(注1)
- SHA-256/SHA-384/SHA-512
(注1) 新たな電子政府用システムを構築する場合,より長いハッシュ値のものが使用できるのであれば,256ビット以上のハッシュ関数を選択することが望ましい.ただし,公開鍵暗号での仕様上,利用すべきハッシュ関数が指定されている場合には,この限りではない.
特殊なハッシュ関数
ハッシュ関数の一種であるが,ある目的に特化したハッシュ関数がある.
- 鍵導出関数 (KDF:Key Derivation Function)
ベースとなる鍵と他のパラメータから指定された長さの共通鍵を生成する関数である.KDF の内部では,擬似乱数生成器や暗号学的ハッシュ関数(パラメータで変更化)が用いられる.しばしば,パスワードをハッシュ化するためにも利用される.
PBKDF1,PBKDF2などがある.
- パスワードハッシュ関数
パスワードをハッシュ化し保存するために特化した関数である.
保存される情報には,アルゴリズム,ソルト,繰り返し回数などのパラメータ情報が含まれており,単なるメッセージのハッシュ値ではない.ソルトや繰り返し回数などのパラメータを持つことにより,同じパスワードでもハッシュ値が異なることになる.また,攻撃に対する耐性を上げるためハッシュ値の生成をあえて遅くすることができる.
bcrypt,Argon2などある
ハッシュ関数のAPI
ハッシュ関数を実現するプログラムは,一般に以下の API を持つ.
- Init(初期化)
内部状態を初期化する.
- Update(更新)
入力データを与えて,ハッシュ処理を行う.このとき,内部状態が更新される. 必要な回数 Update処理を呼ぶ (入力データは,一度にまとめて与えても良いし,分割して与えても良い).
- Final(終了)
最終的なハッシュ値を取り出す.
ハッシュ関数ライブラリを用いてハッシュ値を求める場合,一般に Init -> {Update} -> Final の順で関数を呼び出す (Update は必要な回数繰り返す).新しいハッシュ値を求める場合は,Initより始める.