JavaでSHAダイジェスト値を求める方法

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では 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 クラスを利用するのが良いと考えております。

Java環境構築へ戻る

Javaのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca