検索
連載

Javaでダイジェストを生成するJavaTips 〜Javaプログラミング編

PC用表示
Share
Tweet
LINE
Hatena

ダイジェストの概要

 ダイジェストは、ハッシュ関数(1方向関数)を用いて、ある長さを持つデータを固定長のデータに変換したものです。ダイジェストから元のデータは復元できず、また理論上は異なるデータが同じダイジェストを持つ可能性はあるものの、そのようなデータを見つけることは非常に困難なため、データの一貫性のチェックや認証、暗号化に使用されます。ダイジェスト生成のアルゴリズムとしては、MD5やSHA-1が有名です。

ダイジェストを生成する

 Javaでダイジェストを生成するには、java.security.MessageDigestを使用します。ダイジェストの生成手順は以下のとおりです。

  • 手順1:
    使用するダイジェストのアルゴリズム名を引数としてセットして、getInstanceメソッドを呼び、MessageDigest型のインスタンスを取得します。以降はこのオブジェクトに対して操作を行います。
  • 手順2:
    ダイジェストを求めたいデータをbyte[]型の引数としてセットし、引数がbyte[]型1つであるupdateメソッドを呼びます。データが大きく、一度にすべてをメモリに取り込むことが困難なときは、データを細かく分割し、分割したデータごとにbyte[]型、int型、int型の3引数を取るupdateメソッドを呼びます。第2引数と第3引数で、第1引数のどの範囲をダイジェスト計算に使用するのかを指定します。
  • 手順3:
    digestメソッドを呼び、ダイジェストをbyte[]型として取得します。

 手順1の引数としてセット可能なアルゴリズム名としては、MD5、SHA-1、SHA-256、SHA-384、SHA-512等があります。

ダイジェストの生成例

 ファイルの中身が“1234”であるファイルsecret.txtと、文字列“1234”のバイト配列から、MD5のダイジェストを生成する例を以下に示します。実行例を見ると分かるように、ダイジェストの生成元データが同じであるため、どちらの結果も同じになっています。

リスト1 Digest.java

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


リスト2  secret.txt

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


実行結果(Windows)

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


ダイジェスト使用時の注意点

 最近、MD5や縮小版のSHA-1について衝突(異なるデータで同じダイジェストが生成される)があることが発見されました(http://japan.cnet.com/news/sec/story/0,2000050480,20070525,00.htm)。任意のデータと衝突する別データを検索するアルゴリズムについては、全検索よりも効率が良いものは現時点ではまだ発見されていません。MD5やSHA-1の安全性がすぐに脅かされるわけではありませんが、今後の動向に注意する必要があります。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る