Java のセキュリティ系機能は、かなり充実してきました。
MessageDigestは、ハッシュ値を計算するためのものです。データそれぞれにほとんど重複することのない数値が計算できます。
証明書、電子署名などで暗号化する前段階に使われているものです。
java.security.MessageDigest には2種類使い方があります。
Streamに組み込んで使う方法、単体でデータを投入する方法。
まずは単体で使ってみましょう。
MessageDigest md = MessageDigest.getInstane("MD5");
コンストラクタではなく初期化子によりインスタンスを作ります。アルゴリズムには MD5、SHA-1、SHA-256などがあります。
たとえばファイルを読み込んで計算する場合。
InputStream in = new FileInputStream(ファイル名);
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] data = new byte[2048];
int len = 0;
while (len >= 0) {
len = in.read(data);
md.update(data, 0, len);
}
in.close();
byte[] digest;
digest = md.digest();
java.math.BigInteger bi;
bi = new java.math.BigInteger(digest);
System.out.println("SHA-256: "+bi.toString(16)); // 16進数表示 頭の0は省略されるので適当に
こんな感じ。頭の0は省略されるので適当に md.getDigestLength() で長さを調べて補完してください
update()の処理をInputStreamの形で埋め込んでしまった DigestInputStream というものがあります。
md.update() を省略して、in.getMessageDigest() で計算後のDigestを取り出してそこからdigestを取り出したりできます。
MessageDigest md = MessageDigest.getInstance("SHA-1");
DigestInputStream in = new DigestInputStream(new FileInputStream(ファイル名));
byte[] data = new byte[2048];
int len = 0;
while (len >= 0) {
len = in.read(data);
// md.update(data, 0, len); // 不要
}
in.close();
byte[] digest;
digest = md.digest(); // または in.getMessageDigest().digest();
java.math.BigInteger bi;
bi = new java.math.BigInteger(digest);
System.out.println("SHA-1: "+bi.toString(16)); // 16進数表示
複数のDigestを計算したければ、md5.update(); sha1.update(); と続けてもいいし、DigestInputStream を重ねることもできますね。
[しいしせねっと]