本稿では Java 言語を用いてファイルのダイジェスト値(ハッシュ値)を求める方法について解説します。 MD5, SHA1, SHA256 などの主なダイジェスト値の求め方を紹介します。
ダイジェストの算出クラス
まずは Java でダイジェスト値を算出するクラスに、どのようなものがあるのかを知っている必要があります。 主なものは以下の2つでしょう。
- Apache Commons Codec の DigestUtils クラス
- Java 標準の MessageDigest クラス
どちらでもダイジェスト値を求めることはできますが、筆者としては Apache Commons Codec の DigestUtils クラスの利用をお勧めします。 理由は、Java 標準の MessageDigest クラスは byte[] 型で結果を返却するので、16進数文字列で結果が欲しい場合はもう一手間必要です。 一方 Apache Commons Codec の DigestUtils クラスでは、16進数文字列での結果取得などが容易だからです。
Apache Commons Codec の導入
Apache Commons Codec は、ダウンロードページからダウンロードするか、Apache Maven を利用している場合は、pom.xml につぎのように依存関係を記述することで利用できます。
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>
ファイルのMD5ダイジェスト値を取得する
それでは、ファイルの MD5 ダイジェスト値を求める方法を解説します。 Apache Commons Codec の DigestUtils クラスを使えばとても簡単で、次のように1行で結果を求めることができます。 ここでは sample.txt というファイルの MD5 ダイジェスト値を求めています。
String result = DigestUtils.md5Hex(new FileInputStream(new File("sample.txt")));
DigestUtils の md5Hex メソッドは、InputStream を引数に取ることができますので、FileInputStream を new してあげて MD5 の16進数ダイジェスト値を取得します。
ファイルの SHA-1, SHA-256, SHA-384 SHA-512 ダイジェスト値を取得する
上記の MD5 同様、SHA-1, SHA-256, SHA-384, SHA-512 のダイジェスト値を取得するのも簡単です。
SHA-1
String result = DigestUtils.sha1Hex(new FileInputStream(new File("sample.txt")));
SHA-256
String result = DigestUtils.sha256Hex(new FileInputStream(new File("sample.txt")));
SHA-384
String result = DigestUtils.sha384Hex(new FileInputStream(new File("sample.txt")));
SHA-512
String result = DigestUtils.sha512Hex(new FileInputStream(new File("sample.txt")));
DigestUtils クラスの拡張クラスにしよう
すでにお気づきかもしれませんが、理想としては DigestUtils クラスが File クラスを引数にとってくれると簡単ですが、そのようになっていないので FileInputStream を new して引数に渡しています。 実際のプロジェクトでは、DigestUtils クラスを拡張した次のようなクラスを作り利用するのが便利かもしれません。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class DigestUtils extends org.apache.commons.codec.digest.DigestUtils { public static String sha1Hex(File file) throws FileNotFoundException, IOException { return sha1Hex(new FileInputStream(file)); } public static String sha256Hex(File file) throws FileNotFoundException, IOException { return sha256Hex(new FileInputStream(file)); } public static String sha384Hex(File file) throws FileNotFoundException, IOException { return sha384Hex(new FileInputStream(file)); } public static String sha512Hex(File file) throws FileNotFoundException, IOException { return sha512Hex(new FileInputStream(file)); } public static String md5Hex(File file) throws FileNotFoundException, IOException { return md5Hex(new FileInputStream(file)); } }
おわりに
本稿では Java でファイルのダイジェスト値を求める方法について解説しました。 Apache Commons Codec の DigestUtils クラスを利用して簡単に実現してください。