JavaでのMD5ハッシュ

1概要

MD5は広く使われている暗号ハッシュ関数で、128ビットのハッシュを生成します。

この記事では、 さまざまなJavaライブラリーを使用して MD5ハッシュを作成する** ためのさまざまなアプローチを説明します。

2 MD5 MessageDigest クラスを使用

java.security.MessageDigest Classにハッシュ機能があります。

考えは最初に MessageDigest をSingletonの引数として使いたいアルゴリズムの種類でインスタンス化することです:

MessageDigest.getInstance(String Algorithm)

それから update() 関数を使ってメッセージダイジェストを更新し続けます。

public void update(byte[]input)

あなたが長いファイルを読んでいると言うとき、上記の関数は複数回呼ばれることができます。最後に、ダイジェスト関数を使ってハッシュコードを生成する必要があります。

public byte[]digest()

以下はパスワードのハッシュを生成し、それを検証する例です。

@Test
public void givenPassword__whenHashing__thenVerifying()
  throws NoSuchAlgorithmException {
    String hash = "35454B055CC325EA1AF2126E27707052";
    String password = "ILoveJava";

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(password.getBytes());
    byte[]digest = md.digest();
    String myHash = DatatypeConverter
      .printHexBinary(digest).toUpperCase();

    assertThat(myHash.equals(hash)).isTrue();
}

同様に、ファイルのチェックサムも確認できます。

@Test
public void givenFile__generatingChecksum__thenVerifying()
  throws NoSuchAlgorithmException, IOException {
    String filename = "src/test/resources/test__md5.txt";
    String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(Files.readAllBytes(Paths.get(filename)));
    byte[]digest = md.digest();
    String myChecksum = DatatypeConverter
      .printHexBinary(digest).toUpperCase();

    assertThat(myChecksum.equals(checksum)).isTrue();
}

3 Apache Commons を使用したMD5

org.apache.commons.codec.digest.DigestUtils クラスを使用すると、 MessageDigest クラスを使用して行った上記の操作がはるかに簡単になります。

パスワードのハッシュ化と確認の例を見てみましょう。

@Test
public void givenPassword__whenHashingUsingCommons__thenVerifying()  {
    String hash = "35454B055CC325EA1AF2126E27707052";
    String password = "ILoveJava";

    String md5Hex = DigestUtils
      .md5Hex(password).toUpperCase();

    assertThat(md5Hex.equals(hash)).isTrue();
}

4 Guavaを使用したMD5

以下は com.google.common.io.Files.hash を使用してMD5チェックサムを生成するためのもう1つの簡単な方法です。

@Test
public void givenFile__whenChecksumUsingGuava__thenVerifying()
  throws IOException {
    String filename = "src/test/resources/test__md5.txt";
    String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";

    HashCode hash = com.google.common.io.Files
      .hash(new File(filename), Hashing.md5());
    String myChecksum = hash.toString()
      .toUpperCase();

    assertThat(myChecksum.equals(checksum)).isTrue();
}

5結論

Java APIと、Apache commonsやGuavaのような他のサードパーティAPIには異なるアプローチがあります。プロジェクトの要件およびプロジェクトが従うことを望むかもしれない依存性に基づいて賢く選択してください。

いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/core-java[over on Github]から入手できます。

前の投稿:ジャクソン - どのフィールドをシリアライズ/デシリアライズするかを決める
次の投稿:JUnitParamsの紹介