Java Tips:ハッシュアルゴリズムを使うには?JAVA Developer

パスワードの照合などによく用いられるのがハッシュアルゴリズム,またはダイジェストと呼ばれる関数です。ここでは,広く利用されているハッシュアルゴリズムのMD5を使う方法を紹介します。

» 2004年07月01日 06時13分 公開
[JAVA Developer]

暗号化とは少し違う

 ハッシュアルゴリズムとは,データの全体を反映した別のデータを作るアルゴリズムのことです。ダイジェストとも呼ばれます。データが1ビットでも異なれば,それを反映するハッシュデータも異なる値になります。また,逆方向の変換ができないことも特徴の1つです。計算する過程で情報の一部を意図的に欠落させます。こうすることにより,ハッシュ値から元データを復元できなくすることに大きな特徴があります。

 ハッシュは,大きなデータから小さなハッシュを作ることで「チェックサム」として使うこともあります。この用途には,CRCのようなアルゴリズムも一般的に使われます。

 ハッシュはまた,パスワード照合にも使われます。ハッシュから元データが復元できないため,仮にハッシュが漏れても,パスワードが漏れることを防げます。

 このような特徴を持つため,セキュリティの機能の一部として使われることが多いのですが,暗号化とは少し役割が異なる点に注意してください。

MD5の使い方

 MD5ダイジェストは次のようにして用います。

  • インスタンス生成
  • 初期化(必要に応じて)
  • バッファから必要なデータで更新
  • ダイジェスト値取得

 一度利用したインスタンスを再利用する場合は初期化が必要です。また,ダイジェスト値を計算するバッファがストリームのようになっている場合は,更新処理をループで繰り返すことができます。

 次の例は,ファイルから読み込んだストリームでMD5ダイジェスト値を生成するサンプルです。この例では変数filenameがファイル名を表しています。

java.security.MessageDigest md = 
    java.security.MessageDigest.getInstance("MD5");
md.reset();
java.io.FileInputStream fis = new java.io.FileInputStream(filename);
int read = 0;
byte[] buffer = new byte[1028];
while (-1 != (read = fis.read(buffer)))
{
    md.update(buffer, 0, read);
}
byte[] expectedDigest = md.digest();

 バイト列になっていることからもわかるように,これで得られたハッシュ値は表示には適しません。そのため,出力時には適当な形にフォーマットする必要があります。

 JAVA Developerより毎週Java Tipsをお届けしましょう。バックナンバーもよろしく。

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ