【PHP8.x】hash_hmac関数の使い方

hash_hmac関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

hash_hmac関数は、HMAC(Keyed-Hashing for Message Authentication)アルゴリズムを使用して、指定されたデータと秘密鍵からハッシュ値を生成する関数です。HMACは、データの完全性(改ざんされていないこと)と認証(正規の送信者から送られたこと)を保証するために利用されるメッセージ認証コードの一種です。通常のハッシュ関数に秘密鍵を組み合わせることで、セキュリティを向上させます。

この関数は、まず使用するハッシュアルゴリズムの種類(例えば、「md5」や「sha256」など)、ハッシュ化したいデータ、そしてHMACの計算に使用する秘密鍵の3つの引数を必要とします。秘密鍵は、データの送信者と受信者の間で共有され、これによって認証が行われます。

hash_hmac関数は、計算されたHMAC署名付きハッシュ値を返します。デフォルトでは、ハッシュ値は小文字の16進数文字列として返されますが、オプションの引数をtrueに設定することで、生バイナリ形式のデータとして取得することも可能です。

この関数は、APIリクエストの正当性を検証したり、Webフックの認証を行う際など、データの信頼性とセキュリティが求められる様々な場面で利用されます。データの安全なやり取りにおいて非常に重要な役割を果たす関数です。

構文(syntax)

1<?php
2
3$algorithm = 'sha256'; // 必須: 使用するハッシュアルゴリズム (例: 'md5', 'sha256', 'sha512')
4$dataToHash = 'ここにハッシュ化したいデータ'; // 必須: ハッシュ化する元のデータ
5$secretKey = 'ここにHMAC生成に使う秘密鍵'; // 必須: HMAC計算に使用する秘密鍵
6$returnRawBinary = false; // オプション: trueにすると生バイナリデータ、falseだと小文字の16進数文字列を返す (デフォルトは false)
7
8$hmacValue = hash_hmac($algorithm, $dataToHash, $secretKey, $returnRawBinary);
9
10?>

引数(parameters)

string $algo, string $data, string $key, bool $binary = false

  • string $algo: 使用するハッシュアルゴリズム名を指定する文字列。例: 'md5', 'sha256'
  • string $data: HMACを計算するための元となるデータ
  • string $key: HMACを計算するための秘密鍵
  • bool $binary = false: trueを指定すると、バイナリ形式でハッシュ値が返されます。falseの場合は16進数文字列で返されます。

戻り値(return)

string

指定されたアルゴリズムとキーを使用して生成された、HMAC(Hash-based Message Authentication Code)ハッシュ値が文字列として返されます。

サンプルコード

PHP: hash_hmacでデータ整合性を検証する

1<?php
2
3/**
4 * データのHMAC(Hash-based Message Authentication Code)を生成し、
5 * その後、データが改ざんされていないか検証するサンプル関数群です。
6 *
7 * HMACはデータを「復号(decrypt)」するものではなく、データが送信中に
8 * 変更されていないか、または送信者が秘密鍵を知っている正規のユーザーであるか
9 * を確認するための「メッセージ認証コード」を生成するものです。
10 *
11 * 初心者の方が「decrypt」というキーワードを使う場合、データの安全性を
12 * 確保する一連の処理を指していることが多いと解釈し、ここではHMACを用いた
13 * データ整合性検証のプロセスを示します。
14 */
15
16/**
17 * 指定されたデータと秘密鍵を用いてHMACを生成します。
18 *
19 * @param string $dataToAuthenticate 認証したい元のデータ
20 * @param string $secretKey 秘密鍵
21 * @param string $algo ハッシュアルゴリズム (例: 'sha256', 'md5')
22 * @return string 生成されたHMAC(16進数文字列)
23 */
24function generateHmac(string $dataToAuthenticate, string $secretKey, string $algo = 'sha256'): string
25{
26    // hash_hmac関数は、指定されたアルゴリズム、データ、秘密鍵を用いてHMACを計算します。
27    // 第4引数 $binary はデフォルトで false であり、結果は小文字の16進数文字列として返されます。
28    return hash_hmac($algo, $dataToAuthenticate, $secretKey);
29}
30
31/**
32 * 受信したデータとHMACが正しいかどうかを検証します。
33 *
34 * この関数は、データが改ざんされていないか、または送信者が秘密鍵を知っているか
35 * を確認するために使用されます。
36 *
37 * @param string $dataToVerify 検証するデータ(受信したデータ)
38 * @param string $receivedHmac 受信したHMAC値
39 * @param string $secretKey 検証に使用する秘密鍵
40 * @param string $algo ハッシュアルゴリズム
41 * @return bool データとHMACが一致すれば true、そうでなければ false
42 */
43function verifyHmac(string $dataToVerify, string $receivedHmac, string $secretKey, string $algo = 'sha256'): bool
44{
45    // 1. 受信したデータと秘密鍵を使って、HMACを再計算します。
46    $calculatedHmac = generateHmac($dataToVerify, $secretKey, $algo);
47
48    // 2. 計算されたHMACと受信したHMACを比較して、データが改ざんされていないか検証します。
49    // hash_equals関数は、タイミング攻撃を防ぐために、常に同じ時間で文字列を比較します。
50    return hash_equals($calculatedHmac, $receivedHmac);
51}
52
53// --- 使用例 ---
54
55// 1. 共通の秘密鍵を定義します。実際のアプリケーションでは安全な方法で管理する必要があります。
56$secretKey = 'your_strong_and_secret_key_here_12345';
57
58// 2. 使用するハッシュアルゴリズムを定義します。
59$hashAlgorithm = 'sha256';
60
61// 3. 認証したい元のデータ(例: ユーザーが送信したメッセージやAPIリクエストのペイロード)
62$originalData = 'This is a message that needs its integrity verified.';
63
64echo "--- HMACの生成と検証のプロセス ---" . PHP_EOL;
65
66// --- ステップ1: 送信側(またはデータ生成側)でのHMAC生成 ---
67echo "1. 送信側: データからHMACを生成中..." . PHP_EOL;
68$generatedHmac = generateHmac($originalData, $secretKey, $hashAlgorithm);
69
70echo "   元のデータ: " . $originalData . PHP_EOL;
71echo "   生成されたHMAC: " . $generatedHmac . PHP_EOL . PHP_EOL;
72
73// --- ステップ2: 受信側(またはデータ検証側)でのHMAC検証 ---
74echo "2. 受信側: 受信したデータとHMACを検証中..." . PHP_EOL;
75
76// ケースA: データとHMACが正しく、改ざんされていない場合
77echo "   [ケースA: 正しいデータとHMAC]" . PHP_EOL;
78if (verifyHmac($originalData, $generatedHmac, $secretKey, $hashAlgorithm)) {
79    echo "   検証成功: データは改ざんされていません。安全に処理できます。" . PHP_EOL;
80} else {
81    echo "   検証失敗: データが改ざんされたか、HMACが不正です。" . PHP_EOL;
82}
83echo PHP_EOL;
84
85// ケースB: データが改ざんされた場合
86echo "   [ケースB: データが改ざんされた場合]" . PHP_EOL;
87$tamperedData = 'This is a tampered message!'; // 元のデータが変更されたと仮定
88if (verifyHmac($tamperedData, $generatedHmac, $secretKey, $hashAlgorithm)) {
89    echo "   検証成功: データは改ざんされていません。" . PHP_EOL;
90} else {
91    echo "   検証失敗: データが改ざんされたか、HMACが不正です。(正しく検出)" . PHP_EOL;
92}
93echo PHP_EOL;
94
95// ケースC: HMACが改ざんされた場合(データは正しいがHMACが不正)
96echo "   [ケースC: HMACが改ざんされた場合]" . PHP_EOL;
97$tamperedHmac = 'someFakeHmacValue1234567890abcdef'; // 不正なHMACを仮定
98if (verifyHmac($originalData, $tamperedHmac, $secretKey, $hashAlgorithm)) {
99    echo "   検証成功: データは改ざんされていません。" . PHP_EOL;
100} else {
101    echo "   検証失敗: データが改ざんされたか、HMACが不正です。(正しく検出)" . PHP_EOL;
102}
103echo PHP_EOL;
104
105?>

PHPのhash_hmac関数は、指定されたデータが改ざんされていないか、または送信者が正当なユーザーであるかを確認するための「メッセージ認証コード(HMAC)」を生成します。ご質問の「decrypt」というキーワードは復号を意味しますが、HMACはデータを元に戻す(復号する)機能ではなく、データの整合性と真正性を検証するために利用されます。これは、データが途中で変更されていないことを保証する安全対策の一つです。

この関数は、引数として使用するハッシュアルゴリズムを$algo(例: 'sha256')、認証したい元のデータを$data、そして秘密の鍵を$keyとして受け取ります。最後の引数$binaryfalse(デフォルト値)の場合、結果としてHMACの値を小文字の16進数文字列で返します。

サンプルコードでは、generateHmac関数で元のデータと秘密鍵からHMACを生成し、verifyHmac関数で、受信したデータとHMACが改ざんされていないかを検証する流れを示しています。特にverifyHmac関数内では、新たに計算したHMACと受信したHMACをhash_equals関数で比較し、安全にデータの正当性を確認しています。このようにhash_hmacを使用することで、データの信頼性を高めることができます。

このサンプルコードは、hash_hmac関数がデータを「復号(decrypt)」するものではなく、データの改ざん検知や送信者認証のための「メッセージ認証コード」を生成する点に注意してください。生成されたHMACと受信したHMACの比較には、タイミング攻撃を防ぐためにhash_equals関数を必ず使用します。また、$secretKeyは送信者と受信者で共有する秘密鍵であり、これが漏洩すると認証の意味がなくなるため、実際のアプリケーションでは厳重に管理する必要があります。利用するハッシュアルゴリズムも、安全性の高いものを選択することが重要です。これらの注意点を守ることで、安全なデータ整合性検証を実現できます。

PHPでhash_hmacを計算する

1<?php
2
3/**
4 * hash_hmac関数の基本的な使用例です。
5 * HMAC (Hash-based Message Authentication Code) は、メッセージの完全性と認証を同時に提供するために使用されます。
6 * これにより、メッセージが改ざんされていないこと、および信頼できるソースから送信されたことを検証できます。
7 *
8 * キーワード: php hash_hmac online
9 */
10
11// 1. HMAC計算に必要な情報を定義します。
12$algo = 'sha256'; // 使用するハッシュアルゴリズム (例: 'sha256', 'md5')
13                  // SHA-256は現代のアプリケーションで一般的に推奨される強力なアルゴリズムです。
14$data = 'このメッセージが改ざんされていないことを確認したい。'; // 認証したいデータ(メッセージ)
15$key = 'これは秘密鍵です!誰も知らないでください。'; // HMAC計算に使用する秘密鍵
16
17// 2. hash_hmac関数を呼び出してHMACを計算します。
18//    引数:
19//    - $algo: ハッシュアルゴリズム名
20//    - $data: 認証するメッセージ
21//    - $key: 秘密鍵
22//    - $binary: (オプション) trueの場合、生バイナリデータで返します。
23//               false (デフォルト) の場合、小文字の16進数文字列で返します。
24$hmac_result = hash_hmac($algo, $data, $key);
25
26// 3. 計算されたHMACの結果を表示します。
27echo "--- HMAC Calculation Result ---" . PHP_EOL;
28echo "Algorithm: " . $algo . PHP_EOL;
29echo "Data:      \"" . $data . "\"" . PHP_EOL;
30echo "Key:       \"" . $key . "\"" . PHP_EOL;
31echo "HMAC:      " . $hmac_result . PHP_EOL;
32echo "------------------------------" . PHP_EOL . PHP_EOL;
33
34// 参考: $binary を true に設定すると、生バイナリデータが返されます。
35// その場合、多くの場合 bin2hex() 関数などを使用して16進数表現に変換して表示します。
36// $hmac_binary = hash_hmac($algo, $data, $key, true);
37// echo "HMAC (Binary representation): " . bin2hex($hmac_binary) . PHP_EOL;
38
39?>

PHPのhash_hmac関数は、HMAC(Hash-based Message Authentication Code)を計算するために利用されます。HMACは、メッセージが途中で改ざんされていないこと、および信頼できる送信元から送られてきたことを同時に検証するために使用される、セキュリティ上重要な仕組みです。

このサンプルコードでは、まずHMACの計算に必要な情報を定義しています。$algo変数にはsha256のような使用するハッシュアルゴリズム名を指定します。$data変数には認証したいメッセージ本体、そして$key変数にはHMAC計算の基となる秘密鍵を設定します。

次に、hash_hmac関数を呼び出してHMACを計算します。第一引数$algoでハッシュアルゴリズム、第二引数$dataで対象のメッセージ、第三引数$keyで秘密鍵を渡します。第四引数の$binaryはオプションで、デフォルトはfalseです。falseの場合、関数は計算されたHMACを小文字の16進数文字列として返します。trueに設定すると、生バイナリデータが返されます。

関数はこれらの情報をもとにHMACを計算し、その結果を文字列として返します。この戻り値が、メッセージの完全性と認証を保証するためのHMAC値となります。サンプルコードでは、計算されたHMACの結果と使用した情報を画面に表示しています。hash_hmac関数は、ウェブアプリケーションなどでデータのセキュリティを確保するために不可欠な機能を提供します。

このhash_hmac関数を利用する際は、使用する秘密鍵 $key を厳重に管理し、絶対に外部に漏洩させないことが最も重要です。ハッシュアルゴリズム $algo には、sha256sha512など、現代で推奨される強力なものを選択し、md5sha1といった脆弱なものは避けてください。HMACはメッセージの完全性と認証を確認するために使用され、単なるデータハッシュやパスワードのハッシュ化とは目的が異なります。$binary引数をtrueに設定すると生バイナリデータが返されるため、結果を比較する際は、送信側と受信側で出力形式を合わせるか、bin2hex()などで16進数文字列に統一して扱うと安全です。これにより、メッセージが改ざんされていないことを検証できます。

関連コンテンツ