Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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でHMAC-SHA256をBase64エンコードする

1<?php
2
3/**
4 * hash_hmac 関数を使用して、HMAC-SHA256ハッシュを計算し、Base64エンコードする例。
5 *
6 * HMAC (Keyed-hash Message Authentication Code) は、メッセージ認証コードの一種で、
7 * メッセージの完全性と認証性を保証するために使用されます。
8 * 秘密鍵 (`$key`) を使用してハッシュを生成するため、メッセージが改ざんされていないこと、
9 * および送信者が鍵を知っていることの確認が可能です。
10 *
11 * このサンプルでは、hash_hmac の結果をバイナリ形式で取得し、
12 * その後 base64_encode を使用して、WebやAPIでの転送に適した文字列形式に変換します。
13 *
14 * @param string $data ハッシュ化する元のデータ。
15 * @param string $key HMAC計算に使用する秘密鍵。
16 * @return string 計算されたHMAC-SHA256をBase64エンコードした文字列。
17 */
18function calculateHmacSha256Base64(string $data, string $key): string
19{
20    // HMAC-SHA256 を計算し、生バイナリ形式で結果を取得
21    // $algo に 'sha256' を指定してSHA256アルゴリズムを使用
22    // $binary を true に設定することで、hash_hmac は16進数文字列ではなく生バイナリデータを出力します。
23    $hmacBinary = hash_hmac('sha256', $data, $key, true);
24
25    // 生バイナリデータをBase64エンコードして、ASCII文字列に変換
26    // Base64エンコードは、バイナリデータをテキスト形式で安全に転送するために広く使用されます。
27    $hmacBase64 = base64_encode($hmacBinary);
28
29    return $hmacBase64;
30}
31
32// 使用例
33$secretKey = 'your_super_secret_key'; // 秘密鍵を設定。本番環境では安全な方法で管理してください。
34$messageData = 'Hello, world! This is a test message for HMAC.'; // ハッシュ化するデータ。
35
36// HMAC-SHA256を計算し、Base64エンコードされた結果を取得
37$calculatedHmac = calculateHmacSha256Base64($messageData, $secretKey);
38
39// 結果を出力
40echo "元のデータ: " . $messageData . PHP_EOL;
41echo "秘密鍵: " . $secretKey . PHP_EOL;
42echo "HMAC-SHA256 (Base64エンコード): " . $calculatedHmac . PHP_EOL;
43
44// 検証例: データや鍵が変更されるとHMACも変わることを確認
45// $changedMessageData = 'Hello, world! This is a modified message for HMAC.';
46// $changedHmac = calculateHmacSha256Base64($changedMessageData, $secretKey);
47// echo "変更されたデータに対するHMAC (Base64エンコード): " . $changedHmac . PHP_EOL;
48
49?>

PHPのhash_hmac関数は、メッセージの完全性と認証性を保証するためのHMAC(Keyed-hash Message Authentication Code)を計算します。これは、指定されたデータと秘密鍵を組み合わせてハッシュ値を生成することで、データが改ざんされていないか、また送信者が正しい秘密鍵を持っているかを検証するために利用されます。

このサンプルコードでは、hash_hmac関数を用いて、元のデータと秘密鍵からHMAC-SHA256ハッシュを計算し、その結果をさらにbase64_encode関数でBase64形式の文字列に変換しています。

hash_hmac関数の第一引数$algoには使用するハッシュアルゴリズム名(例: 'sha256')を、第二引数$dataにはハッシュ化したい元のデータを、第三引数$keyにはHMAC計算に用いる秘密鍵を指定します。第四引数$binarytrueに設定することで、ハッシュの結果を生バイナリデータとして取得できます。この生バイナリデータは、そのままではテキストとして扱いにくいため、base64_encode関数でBase64エンコードされたASCII文字列に変換し、WebやAPIでの安全な転送に適した形式にしています。最終的に、この関数はBase64エンコードされたHMAC-SHA256ハッシュ文字列を返します。秘密鍵は非常に重要であり、厳重に管理する必要があります。

hash_hmac関数の第四引数$binaryは、サンプルコードのようにtrueに設定すると、ハッシュが生のバイナリデータで返されます。これにより、base64_encodeと組み合わせることで、WebやAPIでの利用に適した文字化けしにくいテキスト形式に安全に変換できます。特に秘密鍵は厳重な管理が必要です。サンプルコードの$secretKeyは例であり、実際のシステムではコードに直接記述せず、環境変数や鍵管理サービスなどを利用して安全に管理してください。また、利用するハッシュアルゴリズム(例: sha256)は、セキュリティ要件に合わせて適切に選定し、常に最新のセキュリティ情報を確認することをお勧めします。

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関数でHMACを生成する

1<?php
2
3/**
4 * 指定されたデータ、秘密鍵、ハッシュアルゴリズムを使用してHMACを生成します。
5 * HMAC(Keyed-hash Message Authentication Code)は、メッセージの完全性と認証性を同時に保証します。
6 *
7 * @param string $algo 使用するハッシュアルゴリズム(例: 'sha256', 'md5', 'sha512'など)。
8 *                     利用可能なアルゴリズムは hash_algos() 関数で確認できます。
9 * @param string $data ハッシュ化する元のデータ。
10 * @param string $key メッセージ認証に使用する秘密鍵。
11 * @param bool $binary trueの場合、生バイナリデータを出力します。デフォルトはfalse(小文字の16進数文字列)。
12 * @return string 生成されたHMAC(16進数文字列またはバイナリデータ)。
13 */
14function generateHmac(string $algo, string $data, string $key, bool $binary = false): string
15{
16    // hash_hmac関数は、PHP 8で提供されるHMAC生成のための標準関数です。
17    // 引数としてアルゴリズム、データ、秘密鍵、そしてバイナリ出力を指定します。
18    return hash_hmac($algo, $data, $key, $binary);
19}
20
21// --- 使用例 ---
22
23// HMACを生成するための元のデータ
24$originalData = "This is a message that needs to be authenticated.";
25// データの認証に使用する秘密鍵。この鍵は機密情報であり、安全に管理する必要があります。
26$secretKey = "super_secret_authentication_key_12345";
27// 使用するハッシュアルゴリズム。セキュリティ要件に応じて適切なものを選択してください。
28$hashAlgorithm = "sha256"; // SHA-256アルゴリズムを使用
29
30// HMACを生成し、デフォルトの16進数文字列形式で結果を取得
31// 第4引数 $binary を省略すると、デフォルトで false が適用されます。
32$hmacResult = generateHmac($hashAlgorithm, $originalData, $secretKey);
33
34echo "元のデータ: " . $originalData . PHP_EOL;
35echo "使用された秘密鍵: " . $secretKey . PHP_EOL;
36echo "使用されたアルゴリズム: " . $hashAlgorithm . PHP_EOL;
37echo "生成されたHMAC (16進数文字列): " . $hmacResult . PHP_EOL;
38
39// バイナリ形式でHMACを生成する例
40// バイナリデータは直接表示すると文字化けする可能性があるため、通常はbin2hexで16進数に変換して表示します。
41$hmacBinaryResult = generateHmac($hashAlgorithm, $originalData, $secretKey, true);
42echo "生成されたHMAC (バイナリ、16進数変換): " . bin2hex($hmacBinaryResult) . PHP_EOL;
43
44?>

PHPのhash_hmac関数は、指定されたデータと秘密鍵を使用してHMAC(Keyed-hash Message Authentication Code)を生成するための標準的な関数です。HMACは、メッセージの完全性と認証性、つまりメッセージが途中で改ざんされていないことと、正当な送信元から送られたことを同時に保証するために利用されます。

この関数は4つの引数を取ります。最初の$algo引数には、'sha256'や'md5'のようなHMACの計算に用いるハッシュアルゴリズムを文字列で指定します。次に$data引数で、HMACを生成したい元のデータを文字列として渡します。3番目の$key引数には、メッセージの認証に使用する秘密鍵を指定します。この秘密鍵はセキュリティ上非常に重要であり、外部に漏れないよう厳重に管理する必要があります。最後の$binary引数はオプションで、trueを指定するとHMACが生バイナリ形式で出力され、false(デフォルト値)を指定すると小文字の16進数文字列形式で出力されます。

hash_hmac関数は、これらの引数に基づいて計算されたHMACを文字列として返します。サンプルコードでは、generateHmacというヘルパー関数を通じてhash_hmac関数を呼び出し、元のデータ、秘密鍵、ハッシュアルゴリズムを指定してHMACを生成する例を示しています。デフォルトの16進数形式と、$binary引数をtrueにしたバイナリ形式での出力例を確認できます。

この関数を使用する上で最も重要なのは「秘密鍵」の厳重な管理です。秘密鍵は絶対に外部に漏らしてはならず、コード内に直接記述せず、安全な方法で保管し利用してください。ハッシュアルゴリズムは「sha256」や「sha512」など、現在推奨されている強力なものを選択し、「md5」や「sha1」といった安全性の低いアルゴリズムは避けるべきです。第4引数の$binarytrueにすると、結果は生バイナリデータとして返されます。これを画面に表示したり、テキストとして扱う場合は、bin2hex関数などで16進数文字列に変換して利用する配慮が必要です。HMACは単なるハッシュ化ではなく、メッセージの認証と完全性を保証するために用いられることを理解しておきましょう。

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進数文字列に統一して扱うと安全です。これにより、メッセージが改ざんされていないことを検証できます。

関連コンテンツ