本稿では Java 言語で MD5 ハッシュダイジェスト値を求める方法について解説します。
MD5 を求めるいくつかの方法
Java で MD5 ハッシュダイジェスト値を求める方法には、次のようないくつかの方法があります。
- Apache Common Codec の DigestUtils クラスを利用する
- MessageDigest クラスを利用する
筆者個人としては、最近は前者の DigestUtils を利用するようにしています。 その理由も含めて解説していきます。
Apache Commons Codec の DigestUtils クラスを利用する
Apache Commons Codec は言わずと知れた The Apache Software Foundation で開発されている Java 言語ライブラリです。 このライブラリの中に DigestUtils というクラスがあり、そのクラスが MD5 ハッシュダイジェストを求めるメソッドを提供しています。 MD5 ダイジェスト値は16進数文字列で扱う事が多いと思いますが、DigestUtils クラスは16進数文字列をあっさりと返却してくれます。
// 16進数文字列でMD5値を取得する
String hexString = DigestUtils.md5Hex("あいうえお");
DigestUtils クラスは Apache Commons Codec のバージョン 1.2 から利用できますので、相当古いシステムでない限り利用することができます。
MessageDigest クラスを利用する
もう1つの方法としては、Java 標準クラスの java.security.MessageDigest を利用する方法があります。 新たにライブラリを追加せずに利用できるのがメリットです。 私が知る限り Java 1.3 の時からあるクラスなので、今更「今回のプロジェクトの Java のバージョンでも利用できるかな?」などと心配する必要はありません。
文字列から MD5 ハッシュダイジェストを求めるサンプルプログラムは次の通りです。
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] result = md5.digest("あいうえお".getBytes());
MessageDigest を利用して MD5 ハッシュ値を求めた場合、戻り値が byte[] です。 ので、16進数文字列にしたい場合は別途処理が必要となりますので、前述の DigestUtils を使った場合よりも一手間かかってしまいます。 byte[] 型を16進数文字列にする場合に便利なのが Apache Commons Codec の Hex クラスで、次のように簡単に文字列を取得できます。 結局 Apache Commons Codec を利用するのであれば、上記の DigestUtils を使っておけば良いと私は思っています。
byte[] result = ....
String hexString = Hex.encodeHexString(result);
※ Hex クラスは Apache Commons Codec のバージョン 1.4 から利用できます。
まとめ
本稿では Java 言語で MD5 ハッシュ値を求める方法について解説しました。 2015年現在、筆者としては Apache Commons Codec の DigestUtils クラスを利用するのが良いと考えております。