JavaでのMD5ハッシュ

JavaでのMD5ハッシュ

1. 概要

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

この記事では、create MD5 hashes using various Java librariesへのさまざまなアプローチがどのように表示されるかを見ていきます。

2. MessageDigestクラスを使用したMD5

java.security.MessageDigestクラスにハッシュ関数があります。 アイデアは、最初に、シングルトンの引数として使用する種類のアルゴリズムを使用してMessageDigestをインスタンス化することです。

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. md5 ApacheCommonsの使用

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. 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には、さまざまなアプローチがあります。 プロジェクトの要件およびプロジェクトが従う可能性のある依存関係に基づいて賢明に選択します。

いつものように、コードはover on Githubで利用できます。