Java で MD5 ハッシュを生成する

Mohd Mohtashim Nawaz 2023年10月12日
  1. Java での MD5 ハッシュアルゴリズム
  2. Java で MD5 ハッシュを使用する
  3. Java の大規模データに MD5 ハッシュを使用する
  4. まとめ
Java で MD5 ハッシュを生成する

この記事では、データのハッシュを生成するための MD5 アルゴリズムと、Java でデータの MD5 ハッシュを生成する方法について説明します。

Java での MD5 ハッシュアルゴリズム

MD5 ハッシュアルゴリズムは暗号化ハッシュアルゴリズムであり、主にデータファイルのチェックサムとして使用されます。このアルゴリズムを使用して、データの 128 ビット暗号化ハッシュを生成できます。

MD5 ハッシュアルゴリズムは、最新のセキュアハッシュアルゴリズムよりもはるかに高速であるため、広く使用されています。

Java で MD5 ハッシュを使用する

Java は、ファイル転送とサーバー側プログラミングに広く使用されています。MD5 ハッシュを生成するライブラリを見つけることは驚くべきことではありません。Java は、Java の'security'パッケージにある MessageDigestSpi の子クラスである MessageDigest クラスを提供します。

Java で MD5 ハッシュを生成するには、

  • Java セキュリティパッケージから MessageDisgest クラスをインポートします。
  • メッセージダイジェストを取得する前に、データをバイトストリームに変換します。
  • 次に、getInstance() メソッドを呼び出して、MD5 ハッシュアルゴリズムのインスタンスを作成します。

    例 :

    public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
    
  • MD5 ハッシュを取得するデータを渡すことにより、digest() メソッドを呼び出します。

    例:

    public byte[] digest(byte[] input)
    
  • メッセージダイジェストをバイトストリームとしてバイト配列に格納します。
  • 最後に、メッセージダイジェストをバイトから文字列に変換します。

Java で動作するコードを使用して、上記のアプローチを理解しましょう。

コードスニペット:

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class md5Test {
  public static void main(String[] args) {
    String str;
    Scanner scan = new Scanner(System.in);
    str = scan.nextLine();
    System.out.println("Your input: " + str);

    byte[] msg = str.getBytes();

    byte[] hash = null;
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      hash = md.digest(msg);
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    StringBuilder strBuilder = new StringBuilder();
    for (byte b : hash) {
      strBuilder.append(String.format("%02x", b));
    }
    String strHash = strBuilder.toString();
    System.out.println("The MD5 hash: " + strHash);
  }
}

出力:

Hello, Peter
Your input: Hello, Peter
The MD5 hash: 945062a2fee23e0901b37fcb5cd952c9

Java is so awesome.
Your input: Java is so awesome.
The MD5 hash: 601835019da217140c2755c919ee18c2

Java の大規模データに MD5 ハッシュを使用する

大きなデータがある場合、またはデータをチャンクで読み取る場合は、update() メソッドを使用します。

例:

public void update(byte[] input)

データのチャンクを読み取るたびに、現在のチャンクを渡して update() メソッドを呼び出す必要があります。すべてのデータが読み取られたら、次の多態的な形式の digest() メソッドを使用します。

例:

public byte[] digest() // It means you will pass no parameter to the `digest()` method.

デモンストレーションとして、次の例を見ることができます。

コードスニペット:

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class md5Test {
  public static void main(String[] args) {
    String str;
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter message:");
    str = scan.nextLine();
    System.out.println("Your input: " + str);

    byte[] hash = null;

    MessageDigest md = null;

    try {
      md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }

    md.update(str.getBytes());

    System.out.println("Enter message:");
    str = scan.nextLine();

    md.update(str.getBytes());
    hash = md.digest();

    StringBuilder strBuilder = new StringBuilder();
    for (byte b : hash) {
      strBuilder.append(String.format("%02x", b));
    }
    String strHash = strBuilder.toString();
    System.out.println("The MD5 hash: " + strHash);
  }
}

出力:

Enter message:
Hello Java
Your input: Hello Java
Enter message:
I'm Peter
The MD5 hash: 9008f99fa602a036ce0c7a6784b240b1

まとめ

データを共有する際に確保する必要のある基本的なセキュリティ対策の 1つは、データの整合性を確保することです。したがって、整合性を確保するために、受信者と共有されるデータのチェックサムを生成するハッシュアルゴリズムが必要です。

MessageDigest クラスとそのメソッドを使用して MD5 チェックサムを生成するメソッドを理解しました。誤った結果になってしまわないように、データをチャンクで読み取る場合は注意が必要です。