ファイルのメッセージダイジェストを計算する。
SHA1でファイルのメッセージダイジェストを計算するユーティリティを書きました。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.DigestException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * メッセージダイジェストを計算するユーティリティ。 * * @version $Revision:$ * @author $Author:$ */ public class MessageDigestUtil { /** * ファイルのメッセージダイジェストを計算する。 * @param f ファイル * @return 計算したダイジェストの文字列表現 * @throws NoSuchAlgorithmException アルゴリズムが存在しない場合。 * @throws IOException 入出力例外が発生した場合 * @throws DigestException ダイジェストの計算でエラーが発生した場合 */ public static final String digest( File f ) throws NoSuchAlgorithmException, IOException, DigestException { InputStream in = null; try { in = new FileInputStream(f); return digest( in ); } finally { if ( in != null ) { in.close(); } } } /** * 入力ストリームからメッセージダイジェストを計算する。<br/> * <b>注:引数で指定された入力ストリームはクローズされません。</b>呼び出し元でクローズしてください。 * @param in 入力ストリーム * @return 計算したダイジェストの文字列表現 * @throws NoSuchAlgorithmException アルゴリズムが存在しない場合。 * @throws IOException 入出力例外が発生した場合 * @throws DigestException ダイジェストの計算でエラーが発生した場合 */ public static final String digest( InputStream in ) throws NoSuchAlgorithmException, IOException, DigestException { MessageDigest sha = MessageDigest.getInstance("SHA-1"); byte[] buff = new byte[1024]; int length = in.read(buff); while ( length > 0 ) { sha.update( buff, 0, length); length = in.read(buff); } byte[] digest = sha.digest(); return toHexString( digest ); } /** * byte配列を16進数文字列に変換する。 * @param digest byte配列 * @return 変換した文字列 */ private static String toHexString ( byte[] digest ) { StringBuffer buff = new StringBuffer(); for ( byte b : digest ) { buff.append( String.format("%1$02x", b) ); } return buff.toString(); } }
テスト
試しに、このファイルのハッシュを計算してみます。
System.out.println( MessageDigestUtil.digest( new File( "./test.txt")) );
実行結果です。
d494a3a110257cf147c52769f5dc16a88a36c262
sha1sum にかけてみます。
$ sha1sum test.txt d494a3a110257cf147c52769f5dc16a88a36c262 test.txt
同じ結果になりました。期待通りです。
参考:Java 暗号化アーキテクチャ API の仕様およびリファレンス - MessageDigest オブジェクトの計算