- 10.1. メッセージダイジェスト
- 10.2. java.security.MessageDigest
- 10.3. ファイルのハッシュ値
10.3. ファイルのハッシュ値
ダウンロードサイトでは、ダウンロードファイルと一緒にハッシュ値が掲載されていることが多々あります。これはダウンロードファイルが改変されていないことを保証するものです。ダウンロードしたファイルのハッシュ値と、掲載されているハッシュ値が同じであれば、ファイルは改変されていないことを意味します。もし異なっていれば、ファイルの作者が意図したものとは異なったものをダウンロードしている可能性があります。
ファイルからハッシュ値を計算するには、「java.security.DigestInputStream」「java.security.DigestOutputStream」を使用するのが簡単です。共にストリームを通り抜けるデータを基に、ハッシュ値を計算するものです。FileInputStreamやFileOutputStreamと組み合わせれば、ファイルのハッシュ値を計算することができます。以下は指定したファイルのハッシュ値を計算するプログラムです。
import java.security.DigestInputStream; import java.security.MessageDigest; import java.io.FileInputStream; public class FileMD5 { public static void main(String[] args) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); DigestInputStream input = new DigestInputStream(new FileInputStream(args[0]), md); // ファイルの読み込み while(input.read() != -1) { } // ハッシュ値の計算 byte[] digest = md.digest(); input.close(); ... } }
DigestInputStreamの引数には、InputStreamとMessageDigestの2つが必要です。MessageDigestは前節と同じように、getInstanceメソッドを用いて取得します。
あとはDigestInputStreamを用いてファイルの読み込みを行うだけです。DigestInputStreamが自動的にメッセージダイジェストの更新を行ってくれます。読み込みが完了した後、MessageDigestのdigestメソッドを実行すれば、ファイルのハッシュ値を計算することができます。
ハッシュ値を16進数文字列に変換する処理は、前節と同じです。
(実習課題2)
サンプルのプログラムを改良し、同時にファイルの中身も表示できるようにすること。ファイルはテキストファイルを対象とすること。