【PHP8.x】OPENSSL_DEFAULT_STREAM_CIPHERS定数の使い方
OPENSSL_DEFAULT_STREAM_CIPHERS定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
OPENSSL_DEFAULT_STREAM_CIPHERS定数は、PHPのOpenSSL拡張において、ストリームベースのSSL/TLS通信で使用されるデフォルトの暗号スイートリストを表す定数です。この定数に設定されている値は、セキュアな通信を確立する際にどの暗号化アルゴリズム、鍵交換アルゴリズム、ハッシュアルゴリズムの組み合わせ(これらを総称して「暗号スイート」と呼びます)を使用するかを定義します。
具体的には、stream_socket_client()やstream_context_create()といった関数を用いてSSL/TLS接続を行う際、接続コンテキストにおいて明示的に暗号スイートを指定しなかった場合に、この定数で定義されたデフォルトの暗号スイートが適用されます。これにより、開発者が個別に設定しなくても、ある程度のセキュリティレベルを確保した通信がデフォルトで行われるよう設計されています。
データの送受信において機密性や完全性を保つためには、適切な暗号スイートの選択が極めて重要です。この定数に指定されている値は、一般的に推奨されるセキュリティ基準に基づいて選定されていますが、システムやアプリケーションの特定のセキュリティ要件に応じて、より厳格な暗号スイートを適用する必要がある場合もあります。その際は、sslコンテキストオプションのciphersディレクティブを使用することで、このデフォルト設定を上書きし、独自の暗号スイートリストを指定することが可能です。これにより、より柔軟かつ厳密なセキュリティポリシーを実装できます。
構文(syntax)
1<?php 2echo OPENSSL_DEFAULT_STREAM_CIPHERS; 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
この定数は、OpenSSLストリーム暗号化に使用されるデフォルトの暗号スイートを表す文字列を返します。
サンプルコード
PHP OpenSSL: IV長を取得する
1<?php 2 3/** 4 * PHPのOpenSSL機能に関する情報を表示するサンプルコードです。 5 * - OPENSSL_DEFAULT_STREAM_CIPHERS定数の値を確認します。 6 * - openssl_cipher_iv_length関数を使用して、特定の暗号メソッドのIV(Initialization Vector)長を取得します。 7 */ 8function demonstrateOpenSslCipherInfo(): void 9{ 10 // PHPストリームが使用するデフォルトのOpenSSL暗号スイートを表示します。 11 // この定数は、ストリーム暗号化に利用可能な暗号スイートの文字列を提供します。 12 echo "Default OpenSSL Stream Ciphers: " . OPENSSL_DEFAULT_STREAM_CIPHERS . PHP_EOL; 13 14 // --- openssl_cipher_iv_length のデモンストレーション --- 15 // IV (Initialization Vector) は、暗号化に使用されるランダムな値です。 16 // 同じ平文が常に異なる暗号文になるようにするために使われます。 17 18 // デモンストレーション用に一般的な暗号メソッドを選択します。 19 // このメソッドは、OPENSSL_DEFAULT_STREAM_CIPHERSに含まれるものとは限りません。 20 $cipherMethod = 'aes-256-cbc'; 21 22 // 選択した暗号メソッドのIVの長さをバイト単位で取得します。 23 // falseが返された場合、エラーまたは不明な暗号メソッドであることを示します。 24 $ivLength = openssl_cipher_iv_length($cipherMethod); 25 26 if ($ivLength === false) { 27 echo "Error: '{$cipherMethod}' のIV長を取得できませんでした。不明な暗号メソッドの可能性があります。" . PHP_EOL; 28 } else { 29 echo "IV Length for '{$cipherMethod}': {$ivLength} bytes" . PHP_EOL; 30 } 31 32 // 別の暗号メソッドのIV長を取得する例です。 33 $anotherCipherMethod = 'aes-128-gcm'; 34 $anotherIvLength = openssl_cipher_iv_length($anotherCipherMethod); 35 if ($anotherIvLength === false) { 36 echo "Error: '{$anotherCipherMethod}' のIV長を取得できませんでした。不明な暗号メソッドの可能性があります。" . PHP_EOL; 37 } else { 38 echo "IV Length for '{$anotherCipherMethod}': {$anotherIvLength} bytes" . PHP_EOL; 39 } 40} 41 42// デモンストレーション関数を実行します。 43demonstrateOpenSslCipherInfo();
このサンプルコードは、PHPのOpenSSL機能に関する重要な情報を初心者にも分かりやすく示しています。まず、OPENSSL_DEFAULT_STREAM_CIPHERS定数を利用して、PHPのストリーム通信でデフォルトで使用されるOpenSSLの暗号スイート(暗号化方式の組み合わせ)を確認しています。この定数は文字列型の値を持ち、利用可能な暗号スイートの一覧を提供します。
次に、openssl_cipher_iv_length関数の使い方をデモンストレーションしています。この関数は、指定された暗号メソッド(例えば 'aes-256-cbc')で必要となるIV(Initialization Vector)の長さを取得するために使われます。IVは、同じデータを暗号化した場合でも、毎回異なる暗号文が生成されるようにするためのランダムな値です。
openssl_cipher_iv_length関数は、引数として暗号メソッド名を文字列で受け取ります。処理が成功すると、IVの長さをバイト単位の整数値で返します。もし指定された暗号メソッドが存在しない場合や、何らかのエラーが発生した場合は、戻り値としてfalseを返します。サンプルコードでは、複数の暗号メソッドに対してこの関数を適用し、それぞれのIV長を表示することで、OpenSSLを用いたセキュアなデータ処理の基礎情報を提供しています。
OPENSSL_DEFAULT_STREAM_CIPHERS定数は、PHPストリームがデフォルトで利用する暗号スイートを示しますが、これは環境やPHPのビルド設定によって内容が異なる可能性があるため、固定値として扱うべきではありません。実際のアプリケーションでは、セキュリティ要件に基づいて、明示的に暗号スイートを指定することが強く推奨されます。
openssl_cipher_iv_length関数は、特定の暗号メソッドのIV(初期化ベクトル)長を取得するために用いますが、存在しない、あるいはサポートされていない暗号メソッドを指定するとfalseを返します。そのため、戻り値がfalseでないか必ず確認し、エラーハンドリングを適切に行うことが必須です。また、この関数で指定する暗号メソッドは、OPENSSL_DEFAULT_STREAM_CIPHERSが示すリストに限定されるわけではありません。暗号化においては、IVは毎回ランダムに生成し、暗号文と共に安全に管理することが極めて重要です。
PHP openssl_decryptで暗号化・復号化する
1<?php 2 3/** 4 * OpenSSL データ暗号化・復号化のサンプル関数。 5 * 6 * この関数は、指定された平文を OpenSSL を用いて暗号化し、その後復号化します。 7 * OPENSSL_DEFAULT_STREAM_CIPHERS 定数は TLS/SSL ストリームのデフォルト暗号スイートを指定しますが、 8 * openssl_encrypt/decrypt 関数は特定の暗号メソッド名(例: 'aes-256-gcm')を使用します。 9 * ここでは、OPENSSL_DEFAULT_STREAM_CIPHERS にも含まれる可能性のある AES-256-GCM を例として採用しています。 10 * 11 * @param string $plainText 暗号化する平文。 12 * @param string $key 暗号化と復号化に使用する秘密鍵(AES-256-GCMでは32バイト推奨)。 13 * @return string|null 復号化されたテキスト、または処理中にエラーが発生した場合は null。 14 */ 15function encryptAndDecryptExample(string $plainText, string $key): ?string 16{ 17 // PHP 8 の OpenSSL 拡張機能で利用可能なデフォルトのストリーム暗号スイートを出力します。 18 // これは、PHPがSSL/TLS接続(例: HTTPS)で使用する推奨暗号のリストです。 19 // openssl_encrypt/decrypt が直接使用するメソッド名とは異なりますが、関連する暗号技術を示しています。 20 echo "情報: OPENSSL_DEFAULT_STREAM_CIPHERS = " . OPENSSL_DEFAULT_STREAM_CIPHERS . "\n\n"; 21 22 // openssl_encrypt/decrypt で使用する具体的な暗号メソッドを指定します。 23 // OPENSSL_DEFAULT_STREAM_CIPHERS に含まれる 'TLS_AES_256_GCM_SHA384' などに対応する、 24 // openssl_decryptで利用可能な強力なアルゴリズムとして 'aes-256-gcm' を選択します。 25 $cipherMethod = 'aes-256-gcm'; 26 27 // 指定された暗号メソッドに必要な初期化ベクトル (IV) の長さを取得します。 28 $ivLength = openssl_cipher_iv_length($cipherMethod); 29 30 // GCM (Galois/Counter Mode) の場合、認証タグの長さが必要です。 31 // AES-256-GCM では16バイトのタグが推奨されます。 32 $tagLength = 16; 33 34 if ($ivLength === false) { 35 echo "エラー: 無効な暗号メソッドまたはIV長の取得に失敗しました。\n"; 36 return null; 37 } 38 39 // 暗号化ごとに固有のIVを安全に生成します。 40 // IVは暗号化されたデータの機密性を保つために重要です。 41 $iv = openssl_random_pseudo_bytes($ivLength); 42 if ($iv === false) { 43 echo "エラー: IVの生成に失敗しました。\n"; 44 return null; 45 } 46 47 // 認証タグは openssl_encrypt によって生成され、ここに格納されます。 48 // GCMモードでは、データが改ざんされていないことを検証するために使用されます。 49 $tag = ''; 50 51 // --- 暗号化処理 --- 52 $encryptedText = openssl_encrypt( 53 $plainText, // 暗号化する平文 54 $cipherMethod, // 使用する暗号メソッド 55 $key, // 秘密鍵 56 OPENSSL_RAW_DATA, // 出力形式をバイナリ生データにする 57 $iv, // 初期化ベクトル 58 $tag, // 生成された認証タグが格納される 59 '', // AAD (追加認証データ) - この例では使用しない 60 $tagLength // 認証タグの長さ 61 ); 62 63 if ($encryptedText === false) { 64 echo "エラー: 暗号化に失敗しました。\n"; 65 return null; 66 } 67 68 // IV、認証タグ、暗号化データを結合して、単一のデータとして保存または転送できるようにします。 69 // これらは復号化に必須です。 70 $combinedData = $iv . $tag . $encryptedText; 71 echo "暗号化データ (Base64エンコード): " . base64_encode($combinedData) . "\n\n"; 72 73 // --- 復号化処理 --- 74 // 結合されたデータからIV、認証タグ、暗号化されたテキストをそれぞれの部分に抽出します。 75 $extractedIv = substr($combinedData, 0, $ivLength); 76 $extractedTag = substr($combinedData, $ivLength, $tagLength); 77 $extractedEncryptedText = substr($combinedData, $ivLength + $tagLength); 78 79 $decryptedText = openssl_decrypt( 80 $extractedEncryptedText, // 復号化する暗号化されたテキスト 81 $cipherMethod, // 使用した暗号メソッド 82 $key, // 秘密鍵 83 OPENSSL_RAW_DATA, // 入力形式をバイナリ生データとして指定 84 $extractedIv, // 抽出したIV 85 $extractedTag // 抽出した認証タグ(復号化時の認証に使用) 86 ); 87 88 if ($decryptedText === false) { 89 echo "エラー: 復号化に失敗しました。鍵、IV、タグ、または暗号メソッドが正しいか確認してください。\n"; 90 return null; 91 } 92 93 return $decryptedText; 94} 95 96// --- サンプル実行 --- 97$originalText = "システムエンジニア向けのPHPでのOpenSSL暗号化・復号化の例です。"; 98// AES-256-GCM には32バイト (256ビット) の秘密鍵が推奨されます。 99// 鍵は openssl_random_pseudo_bytes で安全に生成し、本番環境では安全な方法で管理(例: 環境変数、KMS)する必要があります。 100$encryptionKey = openssl_random_pseudo_bytes(32); 101 102echo "元のテキスト: " . $originalText . "\n"; 103// セキュリティのため、鍵は通常表示されませんが、デモンストレーションのために表示します。 104echo "鍵 (Base64エンコード, 本番環境では非表示推奨): " . base64_encode($encryptionKey) . "\n\n"; 105 106$decryptedResult = encryptAndDecryptExample($originalText, $encryptionKey); 107 108if ($decryptedResult !== null) { 109 echo "復号化されたテキスト: " . $decryptedResult . "\n"; 110 111 if ($originalText === $decryptedResult) { 112 echo "結果: 暗号化と復号化が成功し、元のテキストと一致しました。\n"; 113 } else { 114 echo "結果: 暗号化と復号化は完了しましたが、テキストが一致しませんでした(エラー)。\n"; 115 } 116} else { 117 echo "結果: エラーにより処理が失敗しました。\n"; 118} 119 120?>
このPHPサンプルコードは、OpenSSL拡張機能を用いてデータを暗号化し、その後元の状態に復号化する基本的な方法を、システムエンジニアを目指す初心者向けに解説しています。
まず、コードの冒頭でOPENSSL_DEFAULT_STREAM_CIPHERS定数の値が出力されます。この定数は、PHPがTLS/SSL接続(例えばHTTPS通信)でデフォルトとして使用する推奨される暗号スイートのリストを示す文字列です。これは、実際にopenssl_encryptやopenssl_decrypt関数でデータを暗号化・復号化する際に直接指定する具体的な暗号メソッド名とは異なりますが、OpenSSLが提供する広範な暗号技術の一部として関連する情報です。
主要な処理はencryptAndDecryptExample関数内で行われます。この関数では、指定された平文をaes-256-gcmという強力な暗号メソッドで暗号化します。openssl_encrypt関数は、暗号化する平文、使用する暗号メソッド、秘密鍵、そして毎回異なる初期化ベクトル(IV)と認証タグを引数として受け取ります。IVは暗号化の安全性を高めるために、認証タグは暗号化されたデータが改ざんされていないことを検証するために不可欠です。この関数は、暗号化されたバイナリデータと生成された認証タグを返しますが、失敗した場合はfalseを返します。
暗号化されたデータ、IV、認証タグは復号化のために全て必要となります。openssl_decrypt関数は、暗号化されたデータ、暗号メソッド、秘密鍵、使用したIV、および認証タグを引数として受け取り、元の平文に復号化を試みます。復号化が成功すれば元の平文が文字列として返され、失敗した場合はfalseが返されます。この一連の処理を通じて、データの機密性と完全性を保つOpenSSLの利用方法を学べます。
OPENSSL_DEFAULT_STREAM_CIPHERSは、HTTPSなどのSSL/TLS接続で使われる推奨暗号のリストであり、openssl_encrypt/decrypt関数が直接指定する個別の暗号メソッド名(例: 'aes-256-gcm')とは用途が異なります。サンプルコードのように、openssl_encrypt/decryptでデータを暗号化する際は、秘密鍵、初期化ベクトル(IV)、認証タグ(GCMモードの場合)の三つが復号に必須です。特に鍵は厳重に管理し、IVは毎回異なる値を安全に生成してください。これらが一つでも欠けたり誤ったりすると、データの復号化に失敗します。また、暗号化されたデータはバイナリ形式なので、保存や転送時にはBase64などでテキスト形式にエンコードするのが一般的です。自己流の暗号実装はセキュリティリスクが高いため、避けてください。