【Java】HMAC-SHA256で文字列を「ハッシュ化」と「メッセージ認証コード(MAC)」の生成をしてみるよ

JavaでHMAC-SHA256で文字列を暗号化し、その結果をString型で出力するには、以下の手順で行うことができます

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class HmacSHA256Example {

    public static String hmacSha256(String secretKey, String message) {
        try {
            // HMAC-SHA256アルゴリズムを指定
            Mac sha256Hmac = Mac.getInstance("HmacSHA256");
            
            // 秘密鍵を指定
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            sha256Hmac.init(secretKeySpec);

            // メッセージをHMAC-SHA256でハッシュ化
            byte[] hash = sha256Hmac.doFinal(message.getBytes(StandardCharsets.UTF_8));

            // Base64でエンコードして文字列に変換
            return Base64.getEncoder().encodeToString(hash);
        } catch (Exception e) {
            throw new RuntimeException("Error while generating HMAC-SHA256", e);
        }
    }

    public static void main(String[] args) {
        String secretKey = "your-secret-key";
        String message = "your-message";

        String hmacSha256 = hmacSha256(secretKey, message);
        System.out.println("HMAC-SHA256: " + hmacSha256);
    }
}
  1. Mac.getInstance(“HmacSHA256”) でHMAC-SHA256アルゴリズムを取得します
  2. SecretKeySpec で秘密鍵を指定し、それをHMAC-SHA256で使うように設定します
  3. sha256Hmac.doFinal(message.getBytes(StandardCharsets.UTF_8)) でメッセージをハッシュ化します
  4. Base64.getEncoder().encodeToString(hash) で結果のバイト配列をBase64形式にエンコードして、文字列として出力します


上記によって、指定された秘密鍵とメッセージを使ってHMAC-SHA256で暗号化した文字列が得られます

HMAC-SHA256は暗号化ではなく「ハッシュ化」と「メッセージ認証コード(MAC)」の生成に使用されます

具体的には以下のように動作します

  • 秘密鍵とメッセージを入力として、HMAC-SHA256アルゴリズムが固定長のハッシュ値を生成します
  • HMACはデータの整合性や改ざん検出に使用され、メッセージ認証コードを生成するための技術です
    • 秘密鍵:データを保護するために使用する共通の鍵です。これを知っている人だけが、同じHMACを生成できます。
    • メッセージ:ハッシュ化されるデータです。このメッセージが変わると、生成されるHMACも変わります。

具体的にはこんな時に使います

  • HMAC-SHA256はデータが改ざんされていないことを確認するために使われます
    受け取った側は同じ秘密鍵を使ってHMACを再計算し、送られてきたHMACと一致するかを確認します
  • これはメッセージそのものを隠す「暗号化」ではなく、メッセージの整合性を確認する「署名」や「ハッシュ化」といったものです

是非フォローしてください

最新の情報をお伝えします