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

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

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

作成日: 更新日:

基本的な使い方

sodium_crypto_auth関数は、メッセージ認証コード(MAC)を生成する関数です。この関数は、特定のメッセージが通信中に改ざんされていないこと、そしてメッセージの送信元が信頼できるものであることを確認するために使われます。具体的には、認証したいデータであるメッセージと、あらかじめ送信者と受信者の間で共有されている秘密鍵の二つの情報を受け取ります。そして、これら二つの情報をもとに、固定長の短い「認証タグ」と呼ばれる文字列を生成して返します。

この認証タグは、メッセージの「指紋」のような役割を果たします。メッセージを受信した側では、受け取ったメッセージと、送信者と同じ秘密鍵を使って、もう一度sodium_crypto_auth関数を実行します。そこで生成された新しい認証タグと、メッセージと一緒に受け取った認証タグを比較することで、メッセージが途中で不正に変更されていないか、また、メッセージを送ってきた人が本物であるかを確実に検証できます。

この関数は、高度な暗号技術を提供するLibsodiumライブラリの一部であり、データの信頼性を保証する上で非常に重要です。ただし、この関数自体はメッセージの内容を秘密にする「暗号化」を行うわけではありません。メッセージの内容を隠したい場合は、別途暗号化のための関数と組み合わせて使用する必要があります。また、使用する秘密鍵は誰にも知られないように厳重に管理することが、この認証システムのセキュリティを保つ上で最も重要です。

構文(syntax)

1<?php
2$message = 'データ本体';
3$key = random_bytes(SODIUM_CRYPTO_AUTH_KEYBYTES);
4
5$authentication_tag = sodium_crypto_auth($message, $key);
6?>

引数(parameters)

string $message, string $key

  • string $message: 認証するメッセージを指定する文字列
  • string $key: 認証に使用する秘密鍵を指定する文字列

戻り値(return)

string

指定されたデータに対して生成された認証タグ(MAC)をバイナリ文字列として返します。

サンプルコード

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

1<?php
2
3// Sodium 拡張がロードされているかを確認します。
4// sodium_crypto_auth_KEYBYTES などの定数は Sodium 拡張によって定義されます。
5if (!extension_loaded('sodium')) {
6    echo "PHP Sodium 拡張がロードされていません。インストールと有効化が必要です。" . PHP_EOL;
7    exit(1);
8}
9
10/**
11 * 指定されたメッセージに対するメッセージ認証コード (MAC) を生成し、表示します。
12 *
13 * この関数は、PHP の Sodium 拡張に含まれる `sodium_crypto_auth` 関数を利用します。
14 * `sodium_crypto_auth` は、メッセージの完全性と認証を保証するための強力なツールです。
15 * 生成されたMACは、メッセージが送受信の過程で改ざんされていないこと、
16 * および特定の秘密鍵を持つエンティティによって認証されたことを確認するために使用されます。
17 *
18 * @param string $message 認証するメッセージ。
19 * @return string 生成されたMAC。バイナリ文字列で返されます。
20 * @throws Exception 秘密鍵の生成に失敗した場合。
21 */
22function generateAndDisplayAuthenticationCode(string $message): string
23{
24    // メッセージ認証コードの生成には、秘密鍵が必要です。
25    // SODIUM_CRYPTO_AUTH_KEYBYTES は、`sodium_crypto_auth` 関数が要求する鍵のバイト長を定義します。
26    // `sodium_randombytes_buf` は、暗号学的に安全なランダムバイト列を生成し、これを秘密鍵として使用します。
27    // 実際のアプリケーションでは、この秘密鍵は安全に生成、保管、管理されるべきです。
28    $key = sodium_randombytes_buf(SODIUM_CRYPTO_AUTH_KEYBYTES);
29    if ($key === false) {
30        throw new Exception("秘密鍵の生成に失敗しました。");
31    }
32
33    // `sodium_crypto_auth` 関数を呼び出して、メッセージと秘密鍵からMACを生成します。
34    // このMACは、メッセージと一緒に送信され、受信側で検証されます。
35    // 例えば、受信側で同じ秘密鍵を使ってメッセージからMACを再生成し、
36    // 送信されてきたMACと一致するかを確認することで、メッセージが改ざんされていないかを確認できます。
37    $mac = sodium_crypto_auth($message, $key);
38
39    echo "--- メッセージ認証コードの生成 ---" . PHP_EOL;
40    echo "オリジナルメッセージ: " . $message . PHP_EOL;
41    // MACはバイナリデータなので、可読性のためHex形式にエンコードして表示します。
42    echo "生成されたMAC (Hexエンコード): " . bin2hex($mac) . PHP_EOL;
43    echo "MACのバイト長: " . strlen($mac) . PHP_EOL;
44
45    // 注意: このサンプルコードでは、秘密鍵を関数内で生成し、その場でMACを生成しています。
46    // 実際の運用では、MACの生成と検証の両方で同じ、安全に管理された秘密鍵を使用する必要があります。
47    // ここでは秘密鍵の表示はしていませんが、セキュリティ上、秘密鍵は決して公開してはいけません。
48
49    return $mac;
50}
51
52// サンプルメッセージを定義します。
53$sampleMessage = "これはPHPのSodium拡張を使って認証されるべきメッセージです。";
54
55try {
56    // 関数を呼び出し、メッセージ認証コードを生成して表示します。
57    generateAndDisplayAuthenticationCode($sampleMessage);
58} catch (Exception $e) {
59    echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL;
60}
61

PHPのSodium拡張は、メッセージのセキュリティを強化するための様々な暗号機能を提供するライブラリです。その中でもsodium_crypto_auth関数は、メッセージ認証コード(MAC)を生成するために使用されます。このMACは、メッセージが送信中に改ざんされていないこと、そして特定の秘密鍵を持つ正当な送信者によって送られたものであることを確認するために利用されます。

この関数は、二つの引数を取ります。一つ目の$messageは、認証を行いたい対象のメッセージ文字列です。二つ目の$keyは、MACを生成するために必要な秘密鍵であり、これは暗号学的に安全なランダムなバイト列である必要があります。特にsodium_randombytes_bufのような関数で生成され、SODIUM_CRYPTO_AUTH_KEYBYTESで定義された推奨バイト長を持つ鍵を使用することが重要です。sodium_crypto_authは、これらの引数から計算されたMACをバイナリ文字列として戻り値で返します。

サンプルコードでは、まずPHPのSodium拡張が正しくロードされているかを確認しています。次に、sodium_randombytes_buf関数を用いて秘密鍵を安全に生成し、その鍵と対象のメッセージを使ってsodium_crypto_auth関数でMACを生成しています。生成されたMACはバイナリデータであるため、可読性を高める目的で16進数にエンコードして表示しています。実際のアプリケーションでは、このMACを受信側で再計算し、元のMACと比較することで、メッセージの完全性と認証性を検証します。秘密鍵の安全な管理が非常に重要である点に注意が必要です。

このコードを利用するには、まずPHPにSodium拡張をインストールし、有効にする必要があります。sodium_crypto_authはメッセージの改ざんを防ぎ、認証を行うための強力な機能です。最も重要な注意点は、メッセージ認証コード(MAC)の生成と検証に用いる秘密鍵の扱いです。サンプルコードでは一時的に生成していますが、実際のシステムではこの秘密鍵を安全に生成、保管、管理し、決して外部に漏らさないようにしてください。MACはメッセージを暗号化するものではなく、メッセージが改ざんされていないことや、特定の鍵を持つエンティティによって作成されたことを確認するために使用されます。生成されたMACはバイナリデータのため、表示する際はbin2hexなどで可読な形式に変換すると良いでしょう。この仕組みを理解し、秘密鍵の管理を徹底することが、安全なシステム構築の鍵となります。

PHP Sodium: メッセージ認証タグ生成と検証

1<?php
2
3/**
4 * sodium_crypto_auth の使用例を示します。
5 * メッセージの認証タグを生成し、その検証を行います。
6 * システムエンジニアを目指す初心者向けに、各ステップをコメントで解説しています。
7 */
8function demonstrateSodiumCryptoAuth(): void
9{
10    // PHPにSodium拡張機能がロードされているか確認します。
11    // 本番環境では必須のチェックですが、サンプルコードでは動作前提とすることも多いです。
12    if (!extension_loaded('sodium')) {
13        echo "エラー: Sodium拡張機能がロードされていません。php.iniで有効化してください。\n";
14        return;
15    }
16
17    // --- 1. 認証キーの生成 ---
18    // sodium_crypto_auth_KEYBYTES は、認証キーとして推奨されるバイト数を定義する定数です。
19    // このキーはメッセージの認証に使用される秘密のデータであり、絶対に漏洩させてはいけません。
20    $key = random_bytes(SODIUM_CRYPTO_AUTH_KEYBYTES);
21    echo "生成された認証キー (HEX): " . bin2hex($key) . "\n\n";
22
23    // --- 2. 認証するメッセージの準備 ---
24    $message = "このメッセージの完全性を保護する必要があります。";
25    echo "認証するメッセージ: " . $message . "\n";
26
27    // --- 3. sodium_crypto_auth 関数による認証タグの生成 ---
28    // sodium_crypto_auth は、指定されたメッセージと秘密鍵を使用して「認証タグ」を生成します。
29    // このタグは、メッセージが改ざんされていないこと(完全性)と、
30    // 正しいキーを持つ者によって作成されたこと(認証)を保証するために使用されます。
31    // 戻り値はバイナリ文字列です。
32    $authenticationTag = sodium_crypto_auth($message, $key);
33
34    echo "生成された認証タグ (HEX): " . bin2hex($authenticationTag) . "\n\n";
35
36    // --- 4. 認証タグの検証 ---
37    // 通常、生成された認証タグはメッセージと一緒に送信され、受信側でそのメッセージが
38    // 改ざんされていないか、また正しい送信者から送られたものかを確認するために検証されます。
39    // 検証には sodium_crypto_auth_verify 関数を使用します。
40
41    echo "--- 認証タグの検証テスト ---\n";
42
43    // --- テストケース 1: 正しいメッセージとキーでの検証 ---
44    echo "1. 正しいメッセージとキーで検証:\n";
45    if (sodium_crypto_auth_verify($authenticationTag, $message, $key)) {
46        echo "   ✅ 成功: メッセージは改ざんされておらず、キーも一致しています。\n\n";
47    } else {
48        // このパスは通常、このテストケースでは実行されません。
49        echo "   ❌ 失敗: 検証エラーが発生しました (予期しない結果)。\n\n";
50    }
51
52    // --- テストケース 2: 改ざんされたメッセージでの検証 ---
53    // メッセージが少しでも変更されると、検証は失敗するはずです。
54    $tamperedMessage = "このメッセージは改ざんされました。";
55    echo "2. 改ざんされたメッセージ ('" . $tamperedMessage . "') で検証:\n";
56    if (sodium_crypto_auth_verify($authenticationTag, $tamperedMessage, $key)) {
57        // このパスは通常、このテストケースでは実行されません。
58        echo "   ❌ 成功 (誤り): メッセージが改ざんされているにもかかわらず、検証が成功しました。\n\n";
59    } else {
60        echo "   ✅ 失敗 (期待通り): メッセージが改ざんされているため、検証は失敗しました。\n\n";
61    }
62
63    // --- テストケース 3: 異なる(不正な)キーでの検証 ---
64    // 正しいメッセージでも、キーが異なると検証は失敗するはずです。
65    $wrongKey = random_bytes(SODIUM_CRYPTO_AUTH_KEYBYTES); // 別の秘密キーを生成
66    echo "3. 異なるキー (HEX: " . bin2hex($wrongKey) . ") で検証:\n";
67    if (sodium_crypto_auth_verify($authenticationTag, $message, $wrongKey)) {
68        // このパスは通常、このテストケースでは実行されません。
69        echo "   ❌ 成功 (誤り): キーが異なるにもかかわらず、検証が成功しました。\n\n";
70    } else {
71        echo "   ✅ 失敗 (期待通り): キーが異なるため、検証は失敗しました。\n\n";
72    }
73}
74
75// 定義した関数を実行して、使用例を表示します。
76demonstrateSodiumCryptoAuth();
77
78?>

PHP 8のsodium_crypto_auth関数は、メッセージの「完全性」と「認証」を保証するために使用される重要なセキュリティ機能です。この関数は、指定されたメッセージが途中で改ざんされていないこと、そして正しい秘密鍵を持つ送信者によって作成されたものであることを検証するための「認証タグ」を生成します。

引数としては、認証したいstring型のメッセージと、秘密として扱うstring型の認証キーが必要です。この認証キーはrandom_bytes(SODIUM_CRYPTO_AUTH_KEYBYTES)のように安全に生成されるべき秘密情報であり、絶対に外部に漏らしてはいけません。関数は、これら二つの入力から一意の認証タグをstringとして返します。

サンプルコードでは、まず秘密の認証キーを生成し、次に特定のメッセージとそのキーを用いてsodium_crypto_authで認証タグを生成しています。その後、生成された認証タグがメッセージと一緒に送信されたと仮定し、受信側でsodium_crypto_auth_verify関数を使ってメッセージが改ざんされていないか、キーが正しいか検証する流れを示しています。メッセージやキーが少しでも異なると、sodium_crypto_auth_verifyは失敗し、改ざんや不正な送信者を検知できることがわかります。このように、sodium_crypto_authはデータの信頼性とセキュリティを確保する上で非常に役立ちます。

sodium_crypto_auth関数は、メッセージの改ざんを検知し、正当な作成者であることを確認するための認証タグを生成します。最も重要な注意点は、認証キーをrandom_bytesで安全に生成し、このキーを絶対に外部に漏らさないことです。キーが漏洩すると、不正なメッセージが認証されてしまう危険があります。この機能を利用する前に、extension_loaded('sodium')でPHPのSodium拡張機能がロードされているか必ず確認してください。生成された認証タグはメッセージと一緒に保存または送信し、その検証には必ずsodium_crypto_auth_verify関数を使用します。メッセージやキーが少しでも異なると検証は失敗しますので、これらの関数を正しく組み合わせて利用することが、メッセージの完全性と認証を保証するために不可欠です。

関連コンテンツ

関連IT用語

関連プログラミング言語