しいしせねっとわーく
[Java] [セキュリティ]

MessageDigestの使い方

Java のセキュリティ系機能は、かなり充実してきました。

MessageDigestの使い方

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 を重ねることもできますね。

[しいしせねっと]