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

【PHP8.x】sodium_crypto_auth_verify()関数の使い方

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

作成日: 更新日:

基本的な使い方

sodium_crypto_auth_verify関数は、PHPのLibreSodium拡張機能が提供する暗号学的なメッセージ認証コード(MAC)を検証するための機能です。この関数は、与えられたメッセージ認証コードが、特定のメッセージと秘密鍵を用いて正しく生成されたものであるかを検査する役割を担います。

この関数の主な目的は、データの完全性と信頼性を保証することです。具体的には、受信したデータが送信元から送られてくる途中で改ざんされていないかを確認したり、メッセージが正当な送信元によって作成されたものであるかを認証したりするために使用されます。

sodium_crypto_auth_verify関数を利用する際には、検証対象となるメッセージ認証コード、そのMACが生成された元のメッセージ、そしてMACの生成時に使用されたのと同じ秘密鍵の三つの情報が必要です。これらの情報がすべて一致した場合にのみ、関数はtrueを返して検証の成功を示します。もしMACがメッセージや秘密鍵と合致しない場合、またはデータが途中で改ざんされていた場合、関数はfalseを返して検証が失敗したことを通知します。

この機能は、通信におけるデータの信頼性を高め、不正なデータの受け入れや偽装されたメッセージによる攻撃からシステムを保護するために非常に重要です。システムエンジニアを目指す方にとって、データのセキュリティを確保するための基本的な仕組みとして理解しておくべき関数の一つと言えます。

構文(syntax)

1$is_valid = sodium_crypto_auth_verify($mac_tag_string, $message_string, $key_string);

引数(parameters)

string $mac, string $message, string $key

  • string $mac: 検証するメッセージ認証コード (MAC)
  • string $message: 検証する元のメッセージ
  • string $key: MACの生成に使用された秘密鍵

戻り値(return)

bool

認証が成功した場合はtrueを、失敗した場合はfalseを返します。

サンプルコード

PHP Sodium: メッセージ認証コードを検証する

1<?php
2
3/**
4 * sodium_crypto_auth_verifyの使用例
5 * メッセージ認証コード (MAC) を検証し、メッセージの改ざんや送信者の詐称を検出します。
6 * Sodiumは、PHPに組み込まれているモダンで使いやすい暗号ライブラリです。
7 */
8
9// 認証キーを生成します。
10// このキーは秘密に保ち、送信者と受信者間で共有されている必要があります。
11$key = sodium_crypto_auth_keygen();
12
13// 認証対象の元のメッセージです。
14$originalMessage = 'Hello, Sodium! This is a secret message.';
15
16// メッセージとキーを使用してMAC (Message Authentication Code) を生成します。
17// このMACはメッセージが改ざんされていないことを検証するために使用されます。
18$mac = sodium_crypto_auth($originalMessage, $key);
19
20echo "元のメッセージ: " . $originalMessage . PHP_EOL;
21echo "生成されたMAC (base64エンコード): " . base64_encode($mac) . PHP_EOL . PHP_EOL;
22
23// --- 正常な検証の例 ---
24echo "--- 正常な検証 ---" . PHP_EOL;
25// 生成されたMAC、元のメッセージ、元のキーを使用して検証を試みます。
26if (sodium_crypto_auth_verify($mac, $originalMessage, $key)) {
27    echo "検証成功: MACはメッセージと一致し、キーも正しいです。メッセージは改ざんされていません。" . PHP_EOL;
28} else {
29    echo "検証失敗: 何らかの問題があります。" . PHP_EOL;
30}
31echo PHP_EOL;
32
33// --- 改ざんされたメッセージでの検証の例 ---
34echo "--- 改ざんされたメッセージでの検証 ---" . PHP_EOL;
35$tamperedMessage = 'Hello, Sodium! This message has been changed.'; // メッセージを改ざん
36echo "改ざんされたメッセージ: " . $tamperedMessage . PHP_EOL;
37
38// 改ざんされたメッセージで元のMACを検証しようとします。
39if (sodium_crypto_auth_verify($mac, $tamperedMessage, $key)) {
40    echo "検証成功 (予期しない結果): 何らかの問題があります。" . PHP_EOL;
41} else {
42    echo "検証失敗 (期待通り): メッセージが改ざんされていることを検出しました。" . PHP_EOL;
43}
44echo PHP_EOL;
45
46// --- 異なるMACでの検証の例 ---
47echo "--- 異なるMACでの検証 ---" . PHP_EOL;
48// 無効なMAC(例: 別のMACを想定)を作成します。
49$invalidMac = sodium_crypto_auth($originalMessage . 'X', $key); // 意図的に異なるMACを生成
50
51echo "元のメッセージ: " . $originalMessage . PHP_EOL;
52echo "異なるMAC (base64エンコード): " . base64_encode($invalidMac) . PHP_EOL;
53
54// 異なるMACで元のメッセージを検証しようとします。
55if (sodium_crypto_auth_verify($invalidMac, $originalMessage, $key)) {
56    echo "検証成功 (予期しない結果): 何らかの問題があります。" . PHP_EOL;
57} else {
58    echo "検証失敗 (期待通り): MACがメッセージと一致しないことを検出しました。" . PHP_EOL;
59}
60echo PHP_EOL;
61
62// --- 異なるキーでの検証の例 ---
63echo "--- 異なるキーでの検証 ---" . PHP_EOL;
64$wrongKey = sodium_crypto_auth_keygen(); // 別のキーを生成
65echo "元のメッセージ: " . $originalMessage . PHP_EOL;
66echo "元のMAC (base64エンコード): " . base64_encode($mac) . PHP_EOL;
67echo "異なるキーを使用" . PHP_EOL;
68
69// 異なるキーで検証しようとします。
70if (sodium_crypto_auth_verify($mac, $originalMessage, $wrongKey)) {
71    echo "検証成功 (予期しない結果): 何らかの問題があります。" . PHP_EOL;
72} else {
73    echo "検証失敗 (期待通り): キーが一致しないことを検出しました。" . PHP_EOL;
74}
75
76?>

sodium_crypto_auth_verifyは、PHP 8に標準で組み込まれている安全な暗号ライブラリであるSodiumの機能の一つです。この関数は、メッセージ認証コード(MAC: Message Authentication Code)を検証し、メッセージが送信中に改ざんされていないこと、そしてメッセージが正しい送信者から送られたものであることを確認するために使用されます。

この関数は、検証対象となるメッセージ認証コードを$mac、元のメッセージを$message、そして認証コードの生成に用いられた秘密の鍵を$keyとして受け取ります。これら三つの引数がすべて一致した場合にのみtrue(真)を返し、メッセージが改ざんされている、MACが異なる、または鍵が一致しないといった不整合がある場合はfalse(偽)を返します。

サンプルコードでは、最初に秘密鍵とメッセージを使ってMACを生成し、そのMACが元のメッセージと鍵で正しく検証される(trueが返る)例を示しています。次に、メッセージを改ざんしたり、異なるMACを使用したり、あるいは誤った鍵を使ったりして検証を試みると、関数は期待通りにfalseを返し、不正な変更や誤った認証試行を検出できることが確認できます。これにより、データの完全性と信頼性を保証することが可能になります。

PHPのsodium_crypto_auth_verify関数は、メッセージ認証コード(MAC)の正当性を検証し、メッセージの改ざんや送信者の詐称を検出します。この関数は、与えられたMAC、元のメッセージ、および共有キーの3つがすべて完全に一致する場合にのみtrueを返します。キーはsodium_crypto_auth_keygen()で生成され、絶対に秘密に保ち、送信者と受信者間で安全に共有する必要があります。キーが漏洩したり、メッセージやMACがわずかでも改ざんされたりすると検証はfalseとなり、セキュリティリスクを示唆します。検証がfalseであった場合は、メッセージが不正である可能性が高いため、適切に処理することが重要です。SodiumはPHP 8に標準搭載されており、安全な暗号処理を容易に利用できるライブラリです。

PHP Sodium: メッセージ認証コードの検証方法

1<?php
2
3/**
4 * sodium_crypto_auth_verify 関数の使用例
5 *
6 * このスクリプトは、メッセージ認証コード (MAC) の生成と検証の基本的な流れを示します。
7 * sodium_crypto_auth_verify は、メッセージが改ざんされていないこと、および
8 * 送信者が正しい鍵を知っていることを確認するために使用されます。
9 */
10
11// 認証キーの生成
12// 実際のアプリケーションでは、この鍵は安全に生成され、保存され、共有される必要があります。
13$key = sodium_crypto_auth_keygen();
14
15// 認証対象の元のメッセージ
16$originalMessage = "秘密のメッセージです。";
17
18// メッセージ認証コード (MAC) の生成
19// sodium_crypto_auth 関数は、メッセージと鍵を使用してMACを生成します。
20$mac = sodium_crypto_auth($originalMessage, $key);
21
22echo "--- sodium_crypto_auth_verify の使用例 ---" . PHP_EOL;
23echo "元のメッセージ: " . $originalMessage . PHP_EOL;
24// MACはバイナリデータなので、表示のためにBase64エンコードします
25echo "生成されたMAC (Base64): " . base64_encode($mac) . PHP_EOL . PHP_EOL;
26
27// 1. 正しいMAC、メッセージ、鍵で検証する (成功例)
28echo "=== 検証ケース 1: 正しいMAC、メッセージ、鍵を使用 ===" . PHP_EOL;
29// sodium_crypto_auth_verify は、MAC、メッセージ、鍵が一致するかを検証します。
30if (sodium_crypto_auth_verify($mac, $originalMessage, $key)) {
31    echo "  検証成功: メッセージは改ざんされていません。" . PHP_EOL;
32} else {
33    echo "  検証失敗: MACまたはメッセージ、鍵のいずれかが不正です。" . PHP_EOL;
34}
35echo PHP_EOL;
36
37// 2. 異なるMACで検証する (失敗例 - MACの改ざん)
38echo "=== 検証ケース 2: 異なるMACを使用 (MACの改ざんをシミュレート) ===" . PHP_EOL;
39// 不正なMACを生成(例として、元のMACの一部を変更)
40$wrongMac = $mac;
41$wrongMac[0] = chr(ord($wrongMac[0]) ^ 0xFF); // 最初のバイトを反転させて改ざん
42if (sodium_crypto_auth_verify($wrongMac, $originalMessage, $key)) {
43    echo "  検証成功: メッセージは改ざんされていません。" . PHP_EOL;
44} else {
45    echo "  検証失敗: MACまたはメッセージ、鍵のいずれかが不正です。" . PHP_EOL;
46}
47echo PHP_EOL;
48
49// 3. 異なるメッセージで検証する (失敗例 - メッセージの改ざん)
50echo "=== 検証ケース 3: 異なるメッセージを使用 (メッセージの改ざんをシミュレート) ===" . PHP_EOL;
51$tamperedMessage = "改ざんされたメッセージです。";
52if (sodium_crypto_auth_verify($mac, $tamperedMessage, $key)) {
53    echo "  検証成功: メッセージは改ざんされていません。" . PHP_EOL;
54} else {
55    echo "  検証失敗: MACまたはメッセージ、鍵のいずれかが不正です。" . PHP_EOL;
56}
57echo PHP_EOL;
58
59// 4. 異なる鍵で検証する (失敗例 - 鍵が不正)
60echo "=== 検証ケース 4: 異なる鍵を使用 (不正な鍵をシミュレート) ===" . PHP_EOL;
61$wrongKey = sodium_crypto_auth_keygen(); // 全く別の鍵を生成
62if (sodium_crypto_auth_verify($mac, $originalMessage, $wrongKey)) {
63    echo "  検証成功: メッセージは改ざんされていません。" . PHP_EOL;
64} else {
65    echo "  検証失敗: MACまたはメッセージ、鍵のいずれかが不正です。" . PHP_EOL;
66}
67echo PHP_EOL;
68
69?>

PHPのsodium_crypto_auth_verify関数は、メッセージ認証コード(MAC)を検証することで、データが改ざんされていないか、また正しい秘密鍵によって生成されたものかを検査します。これは、データの完全性と信頼性を確保するために重要なセキュリティ機能です。

この関数は3つの引数を取ります。1つ目は検証対象のMAC($mac)、2つ目は元のメッセージ($message)、3つ目はMAC生成時に使用された秘密鍵($key)です。これらの引数がすべて一致する場合、つまりメッセージが改ざんされておらず、秘密鍵も正しい場合はtrueを返します。反対に、MAC、メッセージ、鍵のいずれかが異なる場合はfalseを返し、不正なデータやアクセスを検出します。

サンプルコードでは、まずsodium_crypto_auth_keygen()で秘密鍵を、sodium_crypto_auth()でその鍵とメッセージからMACを生成しています。その後、sodium_crypto_auth_verify()を用いて、正しい情報での検証成功例と、MACやメッセージ、鍵のいずれかを意図的に変更した場合に検証が失敗する例を具体的に示し、本関数の働きを理解しやすくしています。

sodium_crypto_auth_verify関数は、メッセージが改ざんされていないことと、送信者が正しい鍵を知っていることを検証する目的で使用されます。この関数の検証が成功するためには、引数として渡すメッセージ認証コード(MAC)、メッセージ、および鍵の全てが完全に一致する必要があります。これら三つの要素のうち、どれか一つでも異なると検証は失敗し、戻り値としてfalseが返されます。特に、認証に使う鍵は非常に重要であり、安全に生成し、厳重に管理・共有するよう注意が必要です。この関数は通常、sodium_crypto_authで生成されたMACを検証するためにペアで利用します。

関連コンテンツ

関連プログラミング言語