ユーティリティ 10章 メッセージダイジェスト
- 10.1. メッセージダイジェスト
- 10.2. java.security.MessageDigest
- 10.3. ファイルのハッシュ値
10.2. java.security.MessageDigest
メッセージダイジェストを実行するには、「java.security.MessageDigest」クラスを使用します。以下はプログラム引数で指定された文字列のハッシュ値を計算するプログラムです。
import java.security.MessageDigest; public class SHA { public static void main(String[] args) { MessageDigest md = MessageDigest.getInstance("SHA"); // ハッシュ値を計算 md.update(args[0].getBytes()); byte[] digest = md.digest(); // 16進数文字列に変換 StringBuffer buffer = new StringBuffer(); for(int i = 0; i < digest.length; i++) { String tmp = Integer.toHexString(digest[i] & 0xff); if(tmp.length() == 1) { buffer.append('0').append(tmp); } else { buffer.append(tmp); } } System.out.println(buffer); } }
まずMessageDigestの「getInstance」メソッドで、MessageDigestインスタンスを取得します。getInstanceメソッドの引数はアルゴリズム名で、JDKでは標準で「SHA」と「MD5」の2つがサポートされています。
MessageDigestを取得したら、「update」メソッドと「digest」メソッドを用いてハッシュ値を計算します。updateメソッドは引数に指定されたbyte配列を用いて、メッセージダイジェストを更新するものです。updateメソッドを呼び出すたびに、ダイジェストは更新されていきます。更新は、現在の値に付け加える形で行われていきます。ですから呼び出す順番によっても、最終的なハッシュ値は異なります。
digestメソッドはハッシュ値を計算し、byte配列で返します。引数にbyte配列を取るものもありますが、それはupdateメソッドを呼び出してから、引数のないdigestメソッドを呼び出すものと考えて下さい。もし連続して、違う文字列に対するハッシュ値を計算する場合には、digestメソッドの後、「reset」メソッドを呼び出すようにして下さい。
なおdigestメソッドの返り値はbyte配列ですから、人間には読みにくいものとなっています。通常は例のように、16進数の文字列に変換します。
(実習課題1)
以下のコンソールアプリケーションを作成しなさい。
- MD5アルゴリズムを用いて、プログラム引数で指定した文字列のハッシュ値を計算して表示すること。
- 複数プログラム引数を指定した場合は、それぞれのハッシュ値を計算すること。