本稿では Java 言語で SHA-1, SHA-256, SHA-384, SHA-512 のハッシュダイジェスト値を求める方法について解説します。
ダイジェスト値を求めるいくつかの方法
Java でダイジェスト値を求める方法には、次のようないくつかの方法があります。
- Apache Common Codec の DigestUtils クラスを利用する。
- MessageDigest クラスを利用する。
筆者個人としては、最近は前者の DigestUtils を利用するようにしています。 その理由も含めて解説していきます。
Apache Commons Codec の DigestUtils クラスを利用する
Apache Commons Codec は言わずと知れた The Apache Software Foundation で開発されている Java 言語ライブラリです。 このライブラリの中に DigestUtils というクラスがあり、そのクラスがダイジェストを求めるメソッドを提供しています。 ダイジェスト値は16進数文字列で扱う事が多いと思いますが、DigestUtils クラスは16進数文字列をあっさりと返却してくれます。
SHA-1
String hexString = DigestUtils.sha1Hex("あいうえお");
SHA-256
String hexString = DigestUtils.sha256Hex("あいうえお");
SHA-384
String hexString = DigestUtils.sha384Hex("あいうえお");
SHA-512
String hexString = DigestUtils.sha512Hex("あいうえお");
MessageDigest クラスを利用する
もう1つの方法としては、Java 標準クラスの java.security.MessageDigest を利用する方法があります。 新たにライブラリを追加せずに利用できるのがメリットです。 私が知る限り Java 1.3 の時からあるクラスなので、今更「今回のプロジェクトの Java のバージョンでも利用できるかな?」などと心配する必要はありません。
文字列から MD5 ハッシュダイジェストを求めるサンプルプログラムは次の通りです。
SHA-1
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] result = digest.digest("あいうえお".getBytes());
SHA-256
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] result = digest.digest("あいうえお".getBytes());
SHA-384
MessageDigest digest = MessageDigest.getInstance("SHA-384");
byte[] result = digest.digest("あいうえお".getBytes());
SHA-512
MessageDigest digest = MessageDigest.getInstance("SHA-512");
byte[] result = digest.digest("あいうえお".getBytes());
MessageDigest を利用してダイジェスト値を求めた場合、戻り値が 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 言語で SHA ダイジェスト値を求める方法について解説しました。 2016年現在、筆者としては Apache Commons Codec の DigestUtils クラスを利用するのが良いと考えております。