【PHP8.x】sodium_crypto_sign_publickey()関数の使い方
sodium_crypto_sign_publickey関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
sodium_crypto_sign_publickey関数は、PHPのSodium拡張が提供する暗号署名機能の一部で、主に鍵ペアから公開鍵を安全に抽出するために利用される関数です。
この関数は、暗号署名においてデータの信頼性を保証するために不可欠な「公開鍵」を扱います。具体的には、sodium_crypto_sign_keypairなどの関数で生成される、秘密鍵と公開鍵が結合されたバイト列(鍵ペア)から、その中の公開鍵の部分だけを分離して取得するために使用されます。
暗号署名とは、あるデータが特定の送信者によって作成され、途中で改ざんされていないことを検証するための技術です。データの送信者は秘密鍵を用いてデータに「署名」し、データの受信者はその署名が正しいかどうかを、対応する公開鍵を用いて検証します。
sodium_crypto_sign_publickey関数で得られた公開鍵は、署名されたメッセージの正当性を確認し、データの改ざんがないこと(データの完全性)と、署名者が間違いなく本人であること(送信元の認証)を検証する際に、必須となる要素です。これにより、Webアプリケーションやシステム間でやり取りされるデータの信頼性とセキュリティを確保するために活用されます。
構文(syntax)
1<?php 2$keypair = sodium_crypto_sign_keypair(); 3$secret_key = sodium_crypto_sign_secretkey($keypair); 4$public_key = sodium_crypto_sign_publickey($secret_key); 5?>
引数(parameters)
string $key_pair
- string $key_pair: 公開鍵と秘密鍵のペアが格納された、バイナリ文字列。
sodium_crypto_sign_keypair()関数で生成されます。
戻り値(return)
string
指定された公開鍵のバイナリ表現を文字列として返します。
サンプルコード
sodium_crypto_sign_publickeyで公開鍵を取得する
1<?php 2 3// PHPのSodium拡張機能を使用して、鍵ペアから公開鍵を抽出するサンプルコードです。 4 5// 1. 署名用の新しい鍵ペアを生成します。 6// sodium_crypto_sign_keypair() 関数は、秘密鍵と公開鍵の両方を含むバイナリ文字列を生成します。 7$keyPair = sodium_crypto_sign_keypair(); 8 9// 2. 生成された鍵ペアから公開鍵のみを抽出します。 10// sodium_crypto_sign_publickey() 関数は、指定された鍵ペア ($keyPair) から公開鍵の部分だけを取り出します。 11$publicKey = sodium_crypto_sign_publickey($keyPair); 12 13// 3. 抽出された公開鍵を表示します。 14// 公開鍵はバイナリデータなので、人間が読みやすいように16進数文字列に変換して出力します。 15echo "抽出された公開鍵 (16進数): " . sodium_bin2hex($publicKey) . PHP_EOL; 16 17?>
sodium_crypto_sign_publickey関数は、PHP 8で提供されるSodium拡張機能の一部であり、デジタル署名に利用される「公開鍵」を鍵ペアから安全に抽出するために使用されます。
サンプルコードでは、まずsodium_crypto_sign_keypair()関数を用いて、デジタル署名に必要な秘密鍵と公開鍵がセットになったバイナリ形式の「鍵ペア」を生成しています。
次に、この生成された鍵ペアをsodium_crypto_sign_publickey()関数に引数$key_pairとして渡します。この関数は、渡された鍵ペアのバイナリデータから、公開鍵の部分だけを正確に抽出し、バイナリ形式の文字列(戻り値string)として返します。公開鍵は、メッセージの署名を検証する際に必要となる重要な情報です。
抽出された公開鍵はバイナリデータであるため、そのままでは人間には読みにくい形式です。そこで、サンプルコードではsodium_bin2hex()関数を使用して、公開鍵を16進数文字列に変換し、コンソールに表示しています。これにより、公開鍵の内容を確認しやすくなります。この関数は、デジタル署名システムの構築において、公開鍵を他のユーザーと共有したり、データベースに保存したりする際に不可欠な役割を担います。
この関数は、sodium_crypto_sign_keypair関数で生成された「鍵ペアのバイナリデータ」を引数として指定する必要があります。単なる文字列を渡すとエラーになるか、期待通りの動作をしません。戻り値の公開鍵もバイナリデータですので、そのまま表示すると文字化けすることがあります。サンプルコードのようにsodium_bin2hexなどで16進数に変換してから扱うと、内容が確認しやすくなります。この機能を使うにはPHPにSodium拡張機能がインストールされ、有効になっている必要がありますので、事前に環境を確認してください。生成される鍵ペアは暗号化の根幹に関わるため、特に秘密鍵を含む鍵ペアの管理は厳重に行い、本番環境での運用ではセキュリティを考慮した永続化や保護策を必ず検討してください。エラー発生時も考慮し、適切なエラーハンドリングを実装しましょう。
PHP Sodium: 署名・暗号化キーペア操作
1<?php 2 3// Sodium拡張が利用可能かチェック 4if (!extension_loaded('sodium')) { 5 die('Sodium extension is not loaded.'); 6} 7 8/** 9 * PHPのSodium拡張を用いた署名と認証付き暗号化の基本的な使用例。 10 * sodium_crypto_sign_publickey 関数と sodium_crypto_box 関連の関数を示します。 11 */ 12function demonstrateSodiumFeatures(): void 13{ 14 echo "--- 署名関連機能 (sodium_crypto_sign) ---\n"; 15 16 // 署名用のキーペアを生成します(秘密鍵と公開鍵を含む) 17 $signKeyPair = sodium_crypto_sign_keypair(); 18 echo "署名キーペアを生成しました。\n"; 19 20 // 生成されたキーペアから署名用の公開鍵を抽出します。 21 // これが `sodium_crypto_sign_publickey` 関数の利用例です。 22 $signPublicKey = sodium_crypto_sign_publickey($signKeyPair); 23 echo "署名用の公開鍵を抽出しました。\n"; 24 25 // 署名用の秘密鍵を抽出します 26 $signSecretKey = sodium_crypto_sign_secretkey($signKeyPair); 27 28 // メッセージを署名し、その署名を検証する例 29 $messageToSign = 'Hello, secure world!'; 30 $signedMessage = sodium_crypto_sign($messageToSign, $signSecretKey); 31 $verifiedMessage = sodium_crypto_sign_open($signedMessage, $signPublicKey); 32 33 if ($verifiedMessage !== false) { 34 echo "メッセージの署名と検証に成功しました。\n"; 35 } else { 36 echo "メッセージの署名検証に失敗しました。\n"; 37 } 38 39 40 echo "\n--- 認証付き暗号化機能 (sodium_crypto_box) ---\n"; 41 42 // sodium_crypto_box はDiffie-Hellman鍵交換に基づいた認証付き暗号化に使われます。 43 // 署名機能とは異なる目的で使用されるキーペアが必要です。 44 45 // 送信者と受信者それぞれの認証付き暗号化用キーペアを生成します 46 $senderBoxKeyPair = sodium_crypto_box_keypair(); 47 $senderBoxPublicKey = sodium_crypto_box_publickey($senderBoxKeyPair); 48 $senderBoxSecretKey = sodium_crypto_box_secretkey($senderBoxKeyPair); 49 50 $recipientBoxKeyPair = sodium_crypto_box_keypair(); 51 $recipientBoxPublicKey = sodium_crypto_box_publickey($recipientBoxKeyPair); 52 $recipientBoxSecretKey = sodium_crypto_box_secretkey($recipientBoxKeyPair); 53 54 echo "認証付き暗号化用のキーペアを生成しました。\n"; 55 echo "ここでは sodium_crypto_box_publickey() を使って公開鍵を抽出します。\n"; 56 // sodium_crypto_sign_publickey で抽出する公開鍵とは用途が異なります。 57 58 $messageToEncrypt = "This is a secret message."; 59 // ランダムなnonce (number once) を生成。暗号化ごとに異なる値である必要があります。 60 $nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES); 61 62 // 送信者が受信者の公開鍵と自身の秘密鍵を使ってメッセージを暗号化します 63 $cipherText = sodium_crypto_box( 64 $messageToEncrypt, 65 $nonce, 66 $recipientBoxPublicKey, // 受信者の公開鍵 67 $senderBoxSecretKey // 送信者の秘密鍵 68 ); 69 echo "メッセージを認証付き暗号化しました。\n"; 70 71 // 受信者が送信者の公開鍵と自身の秘密鍵を使ってメッセージを復号化します 72 $decryptedMessage = sodium_crypto_box_open( 73 $cipherText, 74 $nonce, 75 $senderBoxPublicKey, // 送信者の公開鍵 76 $recipientBoxSecretKey // 受信者の秘密鍵 77 ); 78 79 if ($decryptedMessage !== false) { 80 echo "メッセージの認証付き復号化に成功しました。\n"; 81 } else { 82 echo "メッセージの認証付き復号化に失敗しました。\n"; 83 } 84} 85 86// 関数の実行 87demonstrateSodiumFeatures();
PHPのSodium拡張は、暗号学的な処理を安全に行うための機能を提供します。このサンプルコードは、特にデジタル署名と認証付き暗号化の基本的な使い方を初心者向けに示しています。
まず、デジタル署名機能では、sodium_crypto_sign_keypair()関数で秘密鍵と公開鍵のセットである署名用のキーペアを生成します。このsodium_crypto_sign_publickey()関数は、生成されたキーペア全体(引数$key_pair)から、署名が本物であるかを確認するために必要な「公開鍵」の部分だけを抽出する役割を持ちます。抽出された公開鍵は文字列として返され、メッセージの署名を検証する際に使われます。
コードの後半では、異なる目的を持つ「認証付き暗号化」機能であるsodium_crypto_box関連の関数も紹介されています。sodium_crypto_boxは、メッセージの秘密を守りつつ、改ざんされていないことを保証するために使われる機能です。署名機能とは異なる暗号学的操作のため、sodium_crypto_box_publickey()などを使って別途、暗号化用の公開鍵を抽出する必要があります。このようにSodium拡張では、用途に応じて適切なキーペア生成関数や公開鍵抽出関数を使い分けます。
このサンプルコードは、署名機能と認証付き暗号化機能の二種類を扱っています。sodium_crypto_sign_publickeyで抽出する公開鍵は署名検証にのみ使用され、認証付き暗号化で利用する公開鍵(sodium_crypto_box_publickeyで抽出)とは異なる用途です。これら二つの機能で生成されたキーペアは互換性がなく、混同しないよう注意してください。特に秘密鍵は情報漏洩に直結するため、絶対に公開せず厳重に管理する必要があります。また、sodium_crypto_box関数で暗号化する際に使用するnonce(ナンス)は、毎回異なるランダムな値を用いることが必須であり、再利用はセキュリティ上の重大な脆弱性につながります。復号や検証が失敗した際にはfalseが返されるため、本番環境ではこれらの戻り値に応じた適切なエラー処理を実装することが重要です。コードを実行する前にSodium拡張が正しくロードされているかを確認してください。