ハッシュ関数

ハッシュ関数とは

ハッシュ関数(暗号学的ハッシュ関数)は,入力データに対して暗号変換に似た処理(攪拌処理)を繰り返し施すことにより一定長(128~512ビット程度)のデータになるように入力データを圧縮する関数である. メッセージダイジェストやフィンガープリントとも呼ばれる.

ハッシュ値の計算は比較的単純であり,共通鍵暗号に比べて処理が数十~数百倍以上も速い.このため,ハッシュ関数は以下に示すように情報セキュリティシステムの各所で用いられている.

これらの利用において,異なるメッセージから同じハッシュ値を生成することが実質上ないハッシュ関数を用いることが重要である.さもないと,メッセージの偽造の可能性が高まることになる.そのため,このハッシュ関数はコリジョン・フリー(collision-free)であることが要求される.

コリジョン・フリーとはそのハッシュ関数により同じハッシュ値に圧縮されるメッセージを見つけることが困難であるということである.

すなわち,ハッシュ関数 h は次の条件を満たすことが必要である.

  1. 一方向性(One-way)
    z が与えられたとき,h (x) = z になる x を見つけるのが困難であること.
  2. コリジョンフリー(Collision-free)
    • weakly collision-free
      x が与えられた時,h (x) = h (x') なる x'(xx') を見つけるのが困難であること.
    • strongly collision-free
      h (x) = h(x') かつ xx' なる x, x' を見つけるのが困難であること.

ハッシュ関数アルゴリズム

ハッシュ関数には,入力データの変換処理にブロック暗号を用いる方法と換字と置換を繰り返す専用のアルゴリズムを用いる方法とがある. 前者の方法は ISO-10118-2 で標準化されているが,ブロック暗号として何を用いるかは規定されていない. 後者の代表的なハッシュ関数には,以下に示す MD5 や SHA-1 などがある.

主なハッシュ関数を次の表に示す.

ハッシュ関数
ハッシュ関数 ハッシュ長(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

また,電子政府推奨暗号リストでは,以下のハッシュ関数が推奨されている.

(注1) 新たな電子政府用システムを構築する場合,より長いハッシュ値のものが使用できるのであれば,256ビット以上のハッシュ関数を選択することが望ましい.ただし,公開鍵暗号での仕様上,利用すべきハッシュ関数が指定されている場合には,この限りではない.

特殊なハッシュ関数

ハッシュ関数の一種であるが,ある目的に特化したハッシュ関数がある.

ハッシュ関数のAPI

ハッシュ関数を実現するプログラムは,一般に以下の API を持つ.

ハッシュ関数ライブラリを用いてハッシュ値を求める場合,一般に Init -> {Update} -> Final の順で関数を呼び出す (Update は必要な回数繰り返す).新しいハッシュ値を求める場合は,Initより始める.

inserted by FC2 system