【PHP8.x】SODIUM_CRYPTO_SECRETBOX_MACBYTES定数の使い方
SODIUM_CRYPTO_SECRETBOX_MACBYTES定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
SODIUM_CRYPTO_SECRETBOX_MACBYTES定数は、PHPのSodium拡張機能において、認証付き暗号化に使用されるメッセージ認証コード(MAC)のバイト数を表す定数です。
Sodium拡張は、高度な暗号技術をPHPアプリケーションで安全かつ簡単に利用できるようにするためのものです。その中でも、crypto_secretbox 系の関数は、データを安全に暗号化するだけでなく、そのデータが第三者によって改ざんされていないことを保証する「認証」の機能も提供します。
この認証を行うために、元のデータ(平文)を暗号化した結果には、メッセージ認証コード(MAC)と呼ばれる短いデータが付加されます。このMACは、データの完全性と真正性を検証するために不可欠な部分です。SODIUM_CRYPTO_SECRETBOX_MACBYTES定数は、このMACが何バイトの長さであるかを定義しており、通常は16バイトの値を持ちます。
開発者がcrypto_secretbox系の関数を使ってデータを暗号化したり、あるいは暗号化されたデータを復号化したりする際、このMACのバイト長を正確に把握しておくことが重要になります。例えば、暗号文の特定の部分がMACであると識別したり、復号化処理が内部的にMACを検証したりするために、この定数が利用されます。この定数を使用することで、マジックナンバー(直接的な数値)をコードに埋め込むことなく、セキュリティ上重要なバイト長をプログラムで安全に扱うことができます。これにより、コードの可読性とメンテナンス性が向上し、将来的なライブラリの変更にも柔軟に対応できるようになります。
構文(syntax)
1<?php 2echo SODIUM_CRYPTO_SECRETBOX_MACBYTES; 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
SODIUM_CRYPTO_SECRETBOX_MACBYTES は、暗号化されたメッセージの認証タグ(MAC)のバイト数を表す整数値です。この値は、メッセージの整合性を検証するために使用されます。
サンプルコード
sodium_crypto_secretboxでMACバイト数を確認する
1<?php 2 3/** 4 * SODIUM_CRYPTO_SECRETBOX_MACBYTES 定数の使用例と、 5 * sodium_crypto_secretbox によるメッセージの暗号化・復号化を示します。 6 * 7 * この定数は、メッセージ認証コード (MAC) のバイト数を示しており、 8 * 暗号化されたメッセージのサイズ計算に影響します。 9 * Libsodium 拡張は PHP 7.2 以降で利用可能です。 10 */ 11function demonstrateSecretboxMacbytes(): void 12{ 13 // 暗号化に使用する秘密鍵を生成します。 14 // SODIUM_CRYPTO_SECRETBOX_KEYBYTES は鍵の推奨バイト数 (32バイト) を示します。 15 $key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES); 16 17 // 暗号化に使用するノンス(使い捨ての数値)を生成します。 18 // SODIUM_CRYPTO_SECRETBOX_NONCEBYTES はノンスの推奨バイト数 (24バイト) を示します。 19 // ノンスは毎回異なる値を使い、絶対に再利用してはいけません。 20 $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); 21 22 // 暗号化したい元のメッセージ 23 $originalMessage = "これは非常に秘密のメッセージです。安全に送信しましょう!"; 24 25 echo "=== SODIUM_CRYPTO_SECRETBOX_MACBYTES のデモンストレーション ===\n\n"; 26 27 echo "元のメッセージ: " . $originalMessage . "\n"; 28 // mb_strlen($string, '8bit') で文字列のバイト数を取得します。 29 // これは strlen() と同じですが、マルチバイト対応環境での互換性を高めます。 30 echo "元のメッセージのバイト数: " . mb_strlen($originalMessage, '8bit') . " bytes\n"; 31 32 // SODIUM_CRYPTO_SECRETBOX_MACBYTES は MAC のバイト数 (16バイト) を示します。 33 echo "MAC (Message Authentication Code) のバイト数 (SODIUM_CRYPTO_SECRETBOX_MACBYTES): " . SODIUM_CRYPTO_SECRETBOX_MACBYTES . " bytes\n\n"; 34 35 // sodium_crypto_secretbox を使ってメッセージを暗号化します。 36 // 暗号化されたメッセージには、元のメッセージに加えてMACが含まれます。 37 $encryptedMessage = sodium_crypto_secretbox($originalMessage, $nonce, $key); 38 39 echo "暗号化されたメッセージ (Base64エンコード): " . base64_encode($encryptedMessage) . "\n"; 40 echo "暗号化されたメッセージのバイト数: " . mb_strlen($encryptedMessage, '8bit') . " bytes\n"; 41 42 // 暗号化されたメッセージのバイト数は、元のメッセージのバイト数 + MACバイト数 になります。 43 $expectedEncryptedSize = mb_strlen($originalMessage, '8bit') + SODIUM_CRYPTO_SECRETBOX_MACBYTES; 44 echo "期待される暗号化メッセージバイト数 (元のメッセージバイト数 + MACバイト数): " . $expectedEncryptedSize . " bytes\n\n"; 45 46 if (mb_strlen($encryptedMessage, '8bit') === $expectedEncryptedSize) { 47 echo "✔ バイト数の計算が一致しました。\n\n"; 48 } else { 49 echo "✘ バイト数の計算が一致しませんでした。エラーが発生した可能性があります。\n\n"; 50 } 51 52 // sodium_crypto_secretbox_open を使って暗号化されたメッセージを復号化します。 53 // 鍵とノンスが一致しない場合、またはメッセージが改ざんされている場合は false を返します。 54 $decryptedMessage = sodium_crypto_secretbox_open($encryptedMessage, $nonce, $key); 55 56 if ($decryptedMessage !== false) { 57 echo "復号化されたメッセージ: " . $decryptedMessage . "\n"; 58 if ($decryptedMessage === $originalMessage) { 59 echo "✔ 復号化に成功し、元のメッセージと完全に一致しました。\n"; 60 } else { 61 echo "✘ 復号化は成功しましたが、元のメッセージと一致しませんでした。\n"; 62 } 63 } else { 64 echo "✘ 復号化に失敗しました。鍵、ノンス、またはメッセージが不正な可能性があります。\n"; 65 } 66} 67 68// 関数を実行してデモンストレーションを開始します。 69demonstrateSecretboxMacbytes(); 70 71?>
PHPのSODIUM_CRYPTO_SECRETBOX_MACBYTES定数は、暗号化処理においてメッセージ認証コード(MAC)が占めるバイト数を示す整数値です。この定数の値は16バイトであり、LibreSodium拡張を通じて提供されます。MACは、メッセージが通信中に改ざんされていないことを検証するために使用される重要なデータです。
sodium_crypto_secretbox関数は、指定された秘密鍵と一度だけ使用するノンス(使い捨ての数値)を用いてメッセージを暗号化します。この関数は、引数として元のメッセージ(文字列)、ノンス(文字列)、秘密鍵(文字列)を受け取り、暗号化されたメッセージ(文字列)を返します。暗号化されたメッセージのサイズは、元のメッセージのバイト数にSODIUM_CRYPTO_SECRETBOX_MACBYTESが示すMACのバイト数(16バイト)を加えたものになります。
サンプルコードでは、このSODIUM_CRYPTO_SECRETBOX_MACBYTES定数を使って、暗号化後のメッセージサイズがどのように計算されるかを示しています。また、sodium_crypto_secretboxでメッセージを暗号化し、その結果をsodium_crypto_secretbox_open関数で復号化する一連の流れも確認できます。sodium_crypto_secretbox_open関数は、暗号化されたメッセージ(文字列)、ノンス(文字列)、秘密鍵(文字列)を引数にとり、成功すれば復号されたメッセージ(文字列)を、失敗すればfalseを返します。これにより、暗号化と復号化、そしてMACによる改ざん検知の仕組みが実際に動作することを確認できます。
このコードは、安全なメッセージ暗号化に利用されるLib_sodium拡張機能の重要なポイントを示しています。SODIUM_CRYPTO_SECRETBOX_MACBYTESは、暗号化されたメッセージに付加される認証コードのバイト数を示す定数であり、これにより暗号文のサイズが増加することを理解しておきましょう。
セキュリティの要となる鍵($key)は絶対に漏洩しないよう厳重に管理し、ノンス($nonce)は毎回必ず異なるランダムな値を生成して再利用してはいけません。これらの不適切な扱いは、暗号の安全性を著しく損ないます。
sodium_crypto_secretbox_openがfalseを返す場合、メッセージが改ざんされたか、鍵またはノンスが不正である可能性が高いです。PHP環境でLib_sodium拡張が有効になっていることを事前に確認してください。
sodium_crypto_box で安全なメッセージを送受信する
1<?php 2 3/** 4 * SODIUM_CRYPTO_SECRETBOX_MACBYTES 定数と sodium_crypto_box 関数を使った 5 * 非対称暗号化(公開鍵暗号)のサンプルを示します。 6 * 7 * SODIUM_CRYPTO_SECRETBOX_MACBYTES は、libsodium の認証付き暗号化で使用される 8 * メッセージ認証コード(MAC)のバイト数を示します。 9 * このMACは、暗号文の改ざん検知と送信者の認証を保証するために、 10 * プレーンテキストに付加されてから暗号化されます。 11 * そのため、暗号文の長さは元のプレーンテキストの長さより、この定数分のバイトだけ長くなります。 12 */ 13function demonstrateSodiumCryptoBoxUsage(): void 14{ 15 // SODIUM_CRYPTO_SECRETBOX_MACBYTES の値を確認 16 // この定数は、認証タグのサイズ(バイト数)を示します。 17 echo "SODIUM_CRYPTO_SECRETBOX_MACBYTES: " . SODIUM_CRYPTO_SECRETBOX_MACBYTES . " bytes\n\n"; 18 19 // --- 鍵ペアの生成 --- 20 // 非対称暗号化では、送信者と受信者がそれぞれ公開鍵と秘密鍵のペアを持ちます。 21 // 送信者の鍵ペアを生成 22 $senderKeyPair = sodium_crypto_box_keypair(); 23 $senderPublicKey = sodium_crypto_box_publickey($senderKeyPair); 24 $senderSecretKey = sodium_crypto_box_secretkey($senderKeyPair); 25 26 // 受信者の鍵ペアを生成 27 $receiverKeyPair = sodium_crypto_box_keypair(); 28 $receiverPublicKey = sodium_crypto_box_publickey($receiverKeyPair); 29 $receiverSecretKey = sodium_crypto_box_secretkey($receiverKeyPair); 30 31 // --- メッセージの準備 --- 32 $plaintext = "こんにちは、安全な世界!これは秘密のメッセージです。"; 33 echo "元のプレーンテキスト: " . $plaintext . "\n"; 34 echo "プレーンテキストの長さ: " . strlen($plaintext) . " bytes\n\n"; 35 36 // --- メッセージの暗号化 --- 37 // ノンス (Number used once) の生成 38 // ノンスは暗号化ごとに異なる、予測不可能な値である必要があります。 39 // 同じ鍵とノンスの組み合わせを複数回使用してはいけません。 40 $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES); 41 42 // メッセージを暗号化 43 // 送信者の秘密鍵と受信者の公開鍵を使用して、共通の共有鍵を導出し暗号化を行います。 44 $ciphertext = sodium_crypto_box( 45 $plaintext, 46 $nonce, 47 sodium_crypto_box_keypair_from_secretkey_and_publickey($senderSecretKey, $receiverPublicKey) 48 ); 49 50 echo "暗号文 (Base64エンコード): " . base64_encode($ciphertext) . "\n"; 51 echo "暗号文の長さ: " . strlen($ciphertext) . " bytes\n"; 52 // 暗号文の長さは、元のプレーンテキストの長さにMACバイトが追加されたものになります。 53 echo "期待される暗号文の長さ (プレーンテキスト + MACバイト): " . (strlen($plaintext) + SODIUM_CRYPTO_SECRETBOX_MACBYTES) . " bytes\n\n"; 54 55 // --- メッセージの復号化 --- 56 // メッセージを復号化 57 // 受信者の秘密鍵と送信者の公開鍵を使用して、共通の共有鍵を導出し復号化を行います。 58 // 復号化に成功すると元のメッセージが返され、失敗すると false が返されます。 59 $decryptedMessage = sodium_crypto_box_open( 60 $ciphertext, 61 $nonce, 62 sodium_crypto_box_keypair_from_secretkey_and_publickey($receiverSecretKey, $senderPublicKey) 63 ); 64 65 if ($decryptedMessage !== false) { 66 echo "復号化されたメッセージ: " . $decryptedMessage . "\n"; 67 echo "復号化の成功: " . ($plaintext === $decryptedMessage ? "はい" : "いいえ") . "\n"; 68 } else { 69 echo "復号化に失敗しました! (鍵、ノンス、または暗号文が不正な可能性があります)\n"; 70 } 71} 72 73// サンプル関数を実行 74demonstrateSodiumCryptoBoxUsage();
PHPのSODIUM_CRYPTO_SECRETBOX_MACBYTES定数は、認証付き暗号化において、メッセージの完全性を保証し、改ざんを検知するために付加される「メッセージ認証コード(MAC)」のバイト数を示します。このMACは、暗号化される元のメッセージにこの定数分のデータが追加されるため、最終的な暗号文の長さは元のメッセージよりも長くなります。サンプルコードでは、この定数の値を確認しつつ、非対称暗号化(公開鍵暗号)の具体的な使用例を示しています。
sodium_crypto_box関数は、送信者の秘密鍵と受信者の公開鍵を用いてメッセージを安全に暗号化します。この関数は、暗号化したい「プレーンテキスト」、毎回異なる予測不可能な値である「ノンス」、そして鍵ペアから導出される「共有鍵」を引数に取ります。成功すると、認証タグを含むバイナリ形式の暗号文が戻り値として返されます。この暗号文の長さは、プレーンテキストの長さにSODIUM_CRYPTO_SECRETBOX_MACBYTESで示されるMACのバイト数が加算されたものとなります。
復号化にはsodium_crypto_box_open関数を使用します。この関数は、暗号文、暗号化時と同じノンス、そして受信者の秘密鍵と送信者の公開鍵から導出される共有鍵を引数に取ります。復号化が成功した場合、元のプレーンテキストが戻り値として返されますが、鍵やノンスが不正であったり、暗号文が改ざんされている場合はfalseが返され、データのセキュリティが確保されます。このように、この定数と関数群は、通信の機密性と完全性の両方を保護する強力な手段を提供します。
SODIUM_CRYPTO_SECRETBOX_MACBYTESは、暗号文に付加される認証タグのバイト数を示し、暗号文は元のメッセージよりこの定数分長くなります。最も重要な点として、nonce(ノンス)は毎回必ずユニークで予測不可能な値を生成し、決して使い回さないでください。同じノンスを再利用すると、深刻なセキュリティリスクにつながります。また、生成された秘密鍵は厳重に管理し、決して他者に漏洩させてはなりません。sodium_crypto_box_open関数がfalseを返した場合、復号化に失敗しているため、鍵やノンス、暗号文に問題がある可能性があり、そのエラーを適切に処理する必要があります。共有鍵を導出するsodium_crypto_box_keypair_from_secretkey_and_publickey関数では、送信側と受信側で秘密鍵と公開鍵の引数の順番が逆になる点にも注意が必要です。