【PHP8.x】openssl_verify()関数の使い方
openssl_verify関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
openssl_verify関数は、デジタル署名が正当なものであるかを検証する関数です。この関数は、あるデータに付与されたデジタル署名が、意図した送信者によって作成され、かつそのデータが途中で改ざんされていないことを確認するために使用されます。これにより、データの信頼性と完全性を保証します。
デジタル署名の検証は、現代のデジタル通信において非常に重要なセキュリティプロセスです。この関数を利用するには、検証対象となる元のデータ(例えばファイルの内容やメッセージ)、そのデータに紐付けられたデジタル署名、署名者の公開鍵、そして署名生成時に使用されたハッシュアルゴリズムを引数として指定します。関数はこれらの情報に基づいて、提供された署名が有効であるかどうかを精密に検査します。
検証が成功した場合、関数は整数値の 1 を返します。これは、データが信頼できる送信元からのものであり、その内容が署名後に一切改ざんされていないことを示します。もし署名が無効であるか、データが変更されていると判断された場合は 0 を返します。また、OpenSSLライブラリの内部エラーなど、検証処理中に何らかの問題が発生した場合は -1 を返してエラーを通知します。
この機能は、ウェブサイトからダウンロードしたソフトウェアの真偽を確認したり、セキュアなAPI通信におけるメッセージの改ざん防止や送信元認証を行うなど、多岐にわたる用途でデータの信頼性とセキュリティを確保するために不可欠な要素です。
構文(syntax)
1<?php 2// 検証対象の元のデータ文字列 3$data = 'Original data string to be verified.'; 4 5// 署名データ (バイナリ形式) 6$signature = 'バイナリ形式の署名データ'; // 例: base64_decode() でデコードされたもの 7 8// 公開鍵 (PEM形式の文字列、または OpenSSLAsymmetricKey オブジェクト) 9$publicKey = '-----BEGIN PUBLIC KEY-----PEM形式の公開鍵-----END PUBLIC KEY-----'; // 例: openssl_get_publickey() で取得 10 11// 署名に使用されたハッシュアルゴリズム 12$algorithm = OPENSSL_ALGO_SHA256; // 例: 'sha256' や OPENSSL_ALGO_SHA1 など 13 14// openssl_verify 関数の呼び出し構文 15$verificationResult = openssl_verify($data, $signature, $publicKey, $algorithm); 16?>
引数(parameters)
string $data, string $signature, mixed $public_key, string|int $algorithm = OPENSSL_ALGO_SHA1
- string $data: 検証する元のデータ
- string $signature: 検証に使用する署名
- mixed $public_key: 公開鍵
- string|int $algorithm = OPENSSL_ALGO_SHA1: 使用する署名アルゴリズム
戻り値(return)
int|false
openssl_verify 関数は、指定された署名が公開鍵によって検証されたかどうかを示す整数値を返します。検証に成功した場合は 1、失敗した場合は 0、エラーが発生した場合は false を返します。
サンプルコード
PHP openssl_verify で署名を検証する
1<?php 2 3// このスクリプトは、`openssl_verify` 関数を使用してデジタル署名を検証する方法を示します。 4// 署名の生成から検証、そして検証失敗のシナリオまで、完全なフローを実演します。 5 6// 1. RSA秘密鍵を生成します。 7// 2048ビットは現代において一般的に推奨される鍵長です。 8$privateKey = openssl_pkey_new([ 9 "private_key_bits" => 2048, 10 "private_key_type" => OPENSSL_KEYTYPE_RSA, 11]); 12 13if (!$privateKey) { 14 die("エラー: 秘密鍵の生成に失敗しました。\n" . openssl_error_string()); 15} 16 17// 2. 自己署名証明書を生成し、そこから公開鍵を抽出します。 18// `openssl_verify` はPEM形式の公開鍵文字列または証明書リソースを受け入れます。 19// ここでは、自己署名証明書を作成し、そこからPEM形式の公開鍵文字列を抽出して使用します。 20$csr = openssl_csr_new([], $privateKey, ['digest_alg' => 'sha256']); 21$certificate = openssl_csr_sign($csr, null, $privateKey, $days = 365, ['digest_alg' => 'sha256']); 22 23if (!$certificate) { 24 die("エラー: 証明書の生成に失敗しました。\n" . openssl_error_string()); 25} 26 27// 証明書から公開鍵の詳細を抽出し、PEM形式の公開鍵文字列を取得します。 28$publicKeyDetails = openssl_pkey_get_details($certificate); 29$publicKeyPem = $publicKeyDetails['key']; 30 31// 3. 署名するデータを用意します。 32$dataToSign = "これはデジタル署名される重要なデータです。"; 33 34// 4. 秘密鍵を使用してデータを署名します。 35// 署名アルゴリズムにはSHA256を使用します。 36$signature = ''; 37$signingSuccess = openssl_sign($dataToSign, $signature, $privateKey, OPENSSL_ALGO_SHA256); 38 39if (!$signingSuccess) { 40 die("エラー: データの署名に失敗しました。\n" . openssl_error_string()); 41} 42 43echo "オリジナルデータ: " . $dataToSign . "\n"; 44echo "生成された署名 (base64エンコード): " . base64_encode($signature) . "\n\n"; 45 46// 5. 公開鍵を使用して署名を検証します。 47// 検証アルゴリズムは署名時に使用したもの (OPENSSL_ALGO_SHA256) と一致させる必要があります。 48echo "--- 検証試行1: 有効なデータと署名 ---\n"; 49$verificationResult = openssl_verify($dataToSign, $signature, $publicKeyPem, OPENSSL_ALGO_SHA256); 50 51if ($verificationResult === 1) { 52 echo "検証成功: 署名はデータに対して有効です。\n"; 53} elseif ($verificationResult === 0) { 54 echo "検証失敗: 署名はデータに対して無効です (データまたは署名が改ざんされた可能性があります)。\n"; 55} else { // -1 または false の場合、関数実行中にエラーが発生 56 echo "検証中にエラーが発生しました: " . openssl_error_string() . "\n"; 57} 58echo "\n"; 59 60// --- 「検証失敗」シナリオのデモンストレーション --- 61 62// シナリオ1: データが改ざんされた場合 63echo "--- 検証試行2: データ改ざんのケース ---\n"; 64$tamperedData = "これは改ざんされたデータです。"; // オリジナルデータと異なる 65$verificationResultTamperedData = openssl_verify($tamperedData, $signature, $publicKeyPem, OPENSSL_ALGO_SHA256); 66 67if ($verificationResultTamperedData === 1) { 68 echo "検証成功 (誤り): データが改ざんされているにもかかわらず成功してしまいました。\n"; 69} elseif ($verificationResultTamperedData === 0) { 70 echo "検証失敗 (期待通り): データが改ざんされたため、検証に失敗しました。\n"; 71} else { 72 echo "改ざんされたデータの検証中にエラーが発生しました: " . openssl_error_string() . "\n"; 73} 74echo "\n"; 75 76// シナリオ2: 署名が改ざんされた場合 (または不正な署名) 77echo "--- 検証試行3: 署名改ざんのケース ---\n"; 78$tamperedSignature = 'INVALID' . $signature; // 署名を単純に変更して無効にします 79$verificationResultTamperedSignature = openssl_verify($dataToSign, $tamperedSignature, $publicKeyPem, OPENSSL_ALGO_SHA256); 80 81if ($verificationResultTamperedSignature === 1) { 82 echo "検証成功 (誤り): 署名が改ざんされているにもかかわらず成功してしまいました。\n"; 83} elseif ($verificationResultTamperedSignature === 0) { 84 echo "検証失敗 (期待通り): 署名が改ざんされたため、検証に失敗しました。\n"; 85} else { 86 echo "改ざんされた署名の検証中にエラーが発生しました: " . openssl_error_string() . "\n"; 87} 88echo "\n"; 89 90// 使用したOpenSSLリソースを解放します。 91openssl_pkey_free($privateKey); 92openssl_x509_free($certificate); 93 94?>
PHP 8.4.12のopenssl_verify関数は、デジタル署名が特定のデータに対して有効であるかを検証するために使用されます。これにより、データの改ざんがないことや、署名者が意図した本人であることを確認できます。
このサンプルコードでは、まずRSA秘密鍵を生成し、そこから公開鍵を抽出しています。次に、「これはデジタル署名される重要なデータです。」という文字列($data引数)を秘密鍵で署名し、その結果得られたデジタル署名($signature引数)を準備します。
openssl_verify関数は、この元のデータ、署名、そして公開鍵($public_key引数にはPEM形式の公開鍵文字列や証明書リソースが渡されます)と、署名時に使用したアルゴリズム($algorithm引数)を受け取り、検証を実行します。
検証が成功した場合は戻り値として整数1を返し、署名が無効(データや署名が改ざんされた可能性)な場合は0を返します。関数実行中にエラーが発生した場合は-1またはfalseを返します。サンプルコードでは、データの改ざんや署名の改ざんといった「検証失敗」シナリオも具体的に示されており、この関数がデータの完全性を保証する上で重要であることを理解できます。
openssl_verify関数はデジタル署名の正当性を確認する際に用いられます。この関数を使用する際は、署名時に利用したアルゴリズム(例: OPENSSL_ALGO_SHA256)と検証時に指定するアルゴリズムが完全に一致しているか、必ず確認してください。また、公開鍵はPEM形式の文字列または適切なOpenSSLリソースとして提供する必要があります。関数の戻り値は、検証成功が1、失敗が0、関数実行中のエラーが-1またはfalseとなるため、それぞれのケースを厳密に判断し、適切なエラーハンドリングを行うことが重要です。エラー発生時はopenssl_error_string()で詳細を確認し、デバッグに活用してください。鍵などのOpenSSLリソースは、使用後に必ず解放するようにしてください。
PHP openssl_verifyでデジタル署名を検証する
1<?php 2 3/** 4 * デジタル署名の生成と検証を行うサンプルコードです。 5 * openssl_verify関数を使用して、データと署名が公開鍵と一致するかどうかを確認します。 6 * システムエンジニアを目指す初心者の方にも理解しやすいように、鍵の生成から署名、検証までの一連の流れを示します。 7 */ 8function demonstrateSignatureVerification(): void 9{ 10 // 1. デモンストレーション用に新しい秘密鍵と公開鍵のペアを生成します。 11 // 実際のアプリケーションでは、鍵は安全に生成、保管され、読み込まれます。 12 $privateKey = openssl_pkey_new([ 13 'private_key_bits' => 2048, // 鍵のビット長 14 'private_key_type' => OPENSSL_KEYTYPE_RSA, // RSA鍵タイプ 15 ]); 16 17 if ($privateKey === false) { 18 echo 'エラー: 秘密鍵の生成に失敗しました。' . PHP_EOL; 19 return; 20 } 21 22 // 秘密鍵をPEM形式でエクスポートします。 23 openssl_pkey_export($privateKey, $privateKeyPem); 24 25 // 秘密鍵から公開鍵の詳細を取得し、PEM形式の公開鍵を抽出します。 26 $publicKeyDetails = openssl_pkey_get_details($privateKey); 27 $publicKeyPem = $publicKeyDetails['key'] ?? null; 28 29 if ($publicKeyPem === null) { 30 echo 'エラー: 公開鍵の抽出に失敗しました。' . PHP_EOL; 31 openssl_free_key($privateKey); 32 return; 33 } 34 35 echo "--- 鍵の生成完了 ---" . PHP_EOL; 36 // セキュリティのため、秘密鍵は表示しません。 37 echo "公開鍵の一部:\n" . substr($publicKeyPem, 0, 100) . "..." . PHP_EOL; 38 echo "----------------------" . PHP_EOL . PHP_EOL; 39 40 // 2. 署名対象のデータを用意します。 41 $dataToSign = "これはデジタル署名されるべきデータです。"; 42 echo "署名対象データ: '" . $dataToSign . "'" . PHP_EOL . PHP_EOL; 43 44 // 3. 秘密鍵を使用してデータを署名します。 45 $signature = ''; 46 $signingAlgorithm = OPENSSL_ALGO_SHA256; // 署名にSHA256アルゴリズムを使用 47 48 if (!openssl_sign($dataToSign, $signature, $privateKeyPem, $signingAlgorithm)) { 49 echo 'エラー: データの署名に失敗しました。' . PHP_EOL; 50 openssl_free_key($privateKey); 51 return; 52 } 53 54 echo "署名生成成功 (Base64エンコード): " . base64_encode($signature) . PHP_EOL . PHP_EOL; 55 56 // 4. 公開鍵と元のデータ、生成された署名を使用して署名を検証します。 57 // 署名時と同じアルゴリズムを検証時にも指定する必要があります。 58 $verificationResult = openssl_verify($dataToSign, $signature, $publicKeyPem, $signingAlgorithm); 59 60 echo "--- 署名検証結果 ---" . PHP_EOL; 61 if ($verificationResult === 1) { 62 echo "検証成功: 署名はデータと公開鍵に対して有効です。" . PHP_EOL; 63 } elseif ($verificationResult === 0) { 64 echo "検証失敗: 署名はデータまたは公開鍵に対して無効です。" . PHP_EOL; 65 } else { // $verificationResult === -1 66 echo "検証中にエラーが発生しました。" . PHP_EOL; 67 // openssl_error_string()でOpenSSLのエラーメッセージを取得できます。 68 while (($error = openssl_error_string()) !== false) { 69 echo "OpenSSLエラー: " . $error . PHP_EOL; 70 } 71 } 72 echo "--------------------" . PHP_EOL; 73 74 // 鍵のリソースを解放します (スクリプト終了時に自動的に解放されますが、明示的に行うのも良い習慣です)。 75 openssl_free_key($privateKey); 76} 77 78// デモンストレーション関数を実行します。 79demonstrateSignatureVerification();
PHPのopenssl_verify関数は、デジタル署名の正当性を検証する際に利用されます。この関数は、あるデータに対して作成された署名が、指定された公開鍵によって本物であるかを検証し、データが途中で改ざんされていないことを確認するセキュリティ機能です。
サンプルコードでは、まず秘密鍵と公開鍵のペアを生成し、次に特定のデータを秘密鍵で署名します。その後、openssl_verify関数を使って、この元のデータと生成された署名、そして公開鍵を用いて署名の検証を行います。
引数には、署名対象の$data、秘密鍵で作成された$signature、署名者の$public_key、そして署名時に使用したハッシュ$algorithmを指定します。戻り値は整数値で、1は検証成功を意味し、署名がデータと公開鍵に一致することを示します。0は検証失敗、署名が無効であることを示します。-1は検証処理中にエラーが発生したことを意味します。この関数により、データの完全性と信頼性を保証することができます。
openssl_verify関数でデジタル署名を検証する際、署名時と同じデータとハッシュアルゴリズムを検証時にも使用することが非常に重要です。これらが一致しないと、たとえ有効な署名であっても検証は失敗します。本番環境でこの機能を利用する際は、サンプルコードのように一時的に鍵を生成するのではなく、事前に安全な方法で生成・保管された公開鍵と秘密鍵を使用してください。特に秘密鍵の漏洩はセキュリティ上の致命的な問題となるため、厳重な管理が必須です。また、関数の戻り値が-1の場合は検証エラーが発生していることを示しており、openssl_error_string()関数で詳細なエラーメッセージを取得し、適切に原因を特定して対処してください。
PHP openssl_verifyで署名を検証する
1<?php 2 3/** 4 * openssl_verify 関数を使用したデジタル署名検証のサンプルコードです。 5 * 6 * この関数は、データが秘密鍵で署名され、その署名が公開鍵によって 7 * 正しく検証できることを示します。 8 * 9 * システムエンジニアを目指す初心者向けに、デジタル署名の基本的な流れと 10 * PHPでの実装方法を理解しやすいように構成されています。 11 */ 12function verifyDigitalSignatureExample(): void 13{ 14 echo "--- デジタル署名検証サンプル開始 ---\n\n"; 15 16 // 1. 署名対象の元のデータを用意します。 17 // このデータが後で秘密鍵によって署名され、公開鍵で検証されます。 18 $originalData = "このメッセージはデジタル署名によって保護されます。"; 19 echo "元のデータ: \"" . $originalData . "\"\n\n"; 20 21 // 2. 秘密鍵と公開鍵のペアを生成します。 22 // 実際のシステムでは、通常、これらの鍵は事前に生成され、安全に保管されます。 23 // ここではデモンストレーションのためにコード内で一時的に生成します。 24 $config = [ 25 "private_key_bits" => 2048, // 鍵のビット長(強度の指標、一般的に2048ビット以上が推奨) 26 "private_key_type" => OPENSSL_KEYTYPE_RSA, // RSAアルゴリズムを使用 27 ]; 28 29 // openssl_pkey_new() は新しい秘密鍵を生成し、そのリソースを返します。 30 $privateKeyResource = openssl_pkey_new($config); 31 32 if ($privateKeyResource === false) { 33 echo "エラー: 秘密鍵の生成に失敗しました。\n"; 34 // openssl_error_string() でOpenSSLのエラーメッセージを取得できます。 35 while ($msg = openssl_error_string()) { 36 echo "OpenSSLエラー: " . $msg . "\n"; 37 } 38 return; 39 } 40 41 // 秘密鍵をPEM形式の文字列としてエクスポートします。 42 $privateKey = ''; 43 if (!openssl_pkey_export($privateKeyResource, $privateKey)) { 44 echo "エラー: 秘密鍵のエクスポートに失敗しました。\n"; 45 while ($msg = openssl_error_string()) { 46 echo "OpenSSLエラー: " . $msg . "\n"; 47 } 48 openssl_free_key($privateKeyResource); 49 return; 50 } 51 52 // 公開鍵の詳細を取得し、PEM形式の文字列として抽出します。 53 $publicKeyDetails = openssl_pkey_get_details($privateKeyResource); 54 if ($publicKeyDetails === false || !isset($publicKeyDetails['key'])) { 55 echo "エラー: 公開鍵の取得に失敗しました。\n"; 56 while ($msg = openssl_error_string()) { 57 echo "OpenSSLエラー: " . $msg . "\n"; 58 } 59 openssl_free_key($privateKeyResource); 60 return; 61 } 62 $publicKey = $publicKeyDetails['key']; 63 64 echo "--- 鍵ペア生成完了 ---\n"; 65 // 秘密鍵はセキュリティ上の理由から表示しません。 66 echo "公開鍵の一部 (PEM):\n" . substr($publicKey, 0, 100) . "...\n\n"; // 長いので一部のみ表示 67 68 // 3. 秘密鍵を使ってデータを署名します。 69 // openssl_sign() は、指定されたデータと秘密鍵を使用してデジタル署名を作成します。 70 // OPENSSL_ALGO_SHA256 は、署名にSHA256ハッシュアルゴリズムを使用することを示します。 71 $signature = ''; // 署名結果を格納する変数 72 if (!openssl_sign($originalData, $signature, $privateKey, OPENSSL_ALGO_SHA256)) { 73 echo "エラー: データの署名に失敗しました。\n"; 74 while ($msg = openssl_error_string()) { 75 echo "OpenSSLエラー: " . $msg . "\n"; 76 } 77 openssl_free_key($privateKeyResource); 78 return; 79 } 80 81 echo "--- 署名処理完了 ---\n"; 82 // 署名はバイナリデータなので、表示のためにBase64エンコードします。 83 echo "生成された署名 (Base64エンコード): " . base64_encode($signature) . "\n\n"; 84 85 // 4. 公開鍵を使って署名を検証します。 86 // openssl_verify() は、元のデータ、生成された署名、および公開鍵が一致するかを検証します。 87 // 署名アルゴリズムも、署名時と同じものを指定する必要があります。 88 // 89 // 戻り値: 90 // 1: 署名が有効である (データは改ざんされておらず、署名が正しい) 91 // 0: 署名が無効である (データが改ざんされたか、署名が正しくない) 92 // -1: 検証中にエラーが発生した 93 $verificationResult = openssl_verify($originalData, $signature, $publicKey, OPENSSL_ALGO_SHA256); 94 95 echo "--- 署名検証結果 ---\n"; 96 if ($verificationResult === 1) { 97 echo "✓ 署名が正常に検証されました。データは改ざんされていません。\n"; 98 } elseif ($verificationResult === 0) { 99 echo "✗ 署名検証に失敗しました。データが改ざんされたか、署名が正しくありません。\n"; 100 } else { // $verificationResult === -1 101 echo "✗ 署名検証中にエラーが発生しました。\n"; 102 while ($msg = openssl_error_string()) { 103 echo "OpenSSLエラー: " . $msg . "\n"; 104 } 105 } 106 echo "\n--- デジタル署名検証サンプル終了 ---\n"; 107 108 // 使用した鍵リソースを解放します。 109 openssl_free_key($privateKeyResource); 110} 111 112// サンプル関数を実行します。 113verifyDigitalSignatureExample();
PHPのopenssl_verify関数は、デジタル署名の検証を行うために使用されます。この関数は、あるデータが秘密鍵によって署名され、その署名が対応する公開鍵によって正しく作成されたものであるかを確認します。これにより、データの改ざんがないことと、署名者が確かに意図した本人であること(認証)を保証できます。
この関数は四つの引数を取ります。$dataは検証対象の元のデータ、$signatureは検証したいデジタル署名、$public_keyは署名作成時に使用された秘密鍵と対になる公開鍵、そして$algorithmは署名生成時に使用したハッシュアルゴリズムを指定します。
検証の結果は整数値で返されます。戻り値が1の場合、署名が有効であり、データが改ざんされていないことを示します。0の場合は署名が無効であり、データが改ざんされたか、署名が正しくない可能性を示唆します。また、-1が返された場合は、検証処理中にエラーが発生したことを意味します。この関数は、openssl_sign関数で作成された署名の正当性を確認する際に不可欠です。
openssl_verify関数はデジタル署名の正当性を確認する際に利用されます。この関数の利用で最も重要なのは、署名を作成した際の元のデータ、秘密鍵に対応する公開鍵、そして使用されたハッシュアルゴリズムが、検証時と完全に一致していることです。特にアルゴリズムは、署名時と検証時で異なる場合、正しい署名であっても検証に失敗しますので注意してください。秘密鍵は決して外部に漏らしてはならず、本番環境では鍵の厳重な管理と安全な生成方法を考慮する必要があります。また、検証結果が-1の場合はエラーが発生しているため、openssl_error_string()関数で詳細を確認し、適切なエラーハンドリングを行うことが重要です。鍵リソースを使い終わったらopenssl_free_key()で必ず解放しましょう。
openssl_verifyで署名を検証する
1<?php 2 3/** 4 * データのデジタル署名を生成し、その後検証するサンプル関数。 5 * Openssl拡張機能のopenssl_verify関数の基本的な使用法を示します。 6 * 7 * @param string $originalData 署名と検証の対象となる元のデータ 8 * @return void 9 */ 10function demonstrateOpensslVerify(string $originalData): void 11{ 12 // 1. 秘密鍵と公開鍵のペアを生成 13 // 実際のアプリケーションでは、鍵は通常ファイルから読み込まれます。 14 $privateKey = openssl_pkey_new([ 15 "private_key_bits" => 2048, // 鍵のビット数 (例: 2048ビット) 16 "private_key_type" => OPENSSL_KEYTYPE_RSA, // RSA鍵タイプ 17 ]); 18 19 if ($privateKey === false) { 20 echo "Error: Failed to generate private key. " . openssl_error_string() . PHP_EOL; 21 return; 22 } 23 24 // 秘密鍵から公開鍵の詳細を取得し、公開鍵文字列を抽出 25 $publicKeyDetails = openssl_pkey_get_details($privateKey); 26 $publicKeyString = $publicKeyDetails['key']; 27 28 echo "Original Data: '" . $originalData . "'" . PHP_EOL; 29 30 // 2. 元のデータを秘密鍵でデジタル署名 31 $signature = ''; // 署名結果を格納する変数 32 $signatureResult = openssl_sign($originalData, $signature, $privateKey, OPENSSL_ALGO_SHA256); 33 34 if ($signatureResult === false) { 35 echo "Error: Failed to sign data. " . openssl_error_string() . PHP_EOL; 36 return; 37 } 38 39 echo "Data successfully signed. Signature generated." . PHP_EOL; 40 41 // 3. 署名を公開鍵で検証 42 // openssl_verify は、元のデータ、署名、公開鍵(またはX.509証明書)、ハッシュアルゴリズムを受け取ります。 43 // 戻り値は 1 (検証成功), 0 (検証失敗), -1 (エラー) です。 44 $verificationResult = openssl_verify($originalData, $signature, $publicKeyString, OPENSSL_ALGO_SHA256); 45 46 echo "--- Verification Attempt 1 (Valid Data & Signature) ---" . PHP_EOL; 47 if ($verificationResult === 1) { 48 echo "RESULT: Signature is VALID. Data has not been tampered with." . PHP_EOL; 49 } elseif ($verificationResult === 0) { 50 echo "RESULT: Signature is INVALID. Data may have been tampered with." . PHP_EOL; 51 } else { // $verificationResult === -1 52 echo "RESULT: An ERROR occurred during verification: " . openssl_error_string() . PHP_EOL; 53 } 54 55 // 4. データが改ざんされた場合の検証失敗をシミュレート 56 $tamperedData = $originalData . " (tampered)"; 57 $tamperedVerificationResult = openssl_verify($tamperedData, $signature, $publicKeyString, OPENSSL_ALGO_SHA256); 58 59 echo PHP_EOL . "--- Verification Attempt 2 (Tampered Data) ---" . PHP_EOL; 60 echo "Tampered Data: '" . $tamperedData . "'" . PHP_EOL; 61 if ($tamperedVerificationResult === 1) { 62 echo "RESULT: Signature is VALID (this should NOT happen with tampered data!)." . PHP_EOL; 63 } elseif ($tamperedVerificationResult === 0) { 64 echo "RESULT: Signature is INVALID (as expected, since data was altered)." . PHP_EOL; 65 } else { // $tamperedVerificationResult === -1 66 echo "RESULT: An ERROR occurred during verification: " . openssl_error_string() . PHP_EOL; 67 } 68 69 // 生成した鍵のリソースはPHPのスクリプト終了時に自動的に解放されますが、 70 // openssl_pkey_free($privateKey); のように明示的に解放することも可能です。 71} 72 73// サンプル関数を実行 74demonstrateOpensslVerify("Hello, world! This is a confidential message that needs integrity protection."); 75
PHP 8のopenssl_verify関数は、デジタル署名が本物であるか、またデータが改ざんされていないかを検証するために使用されます。この機能により、データの完全性と信頼性を確保できます。
この関数は、署名対象となった元のデータ、秘密鍵で生成されたデジタル署名、そして署名に用いられた秘密鍵に対応する公開鍵を引数として受け取ります。また、署名時に使用したハッシュアルゴリズムを指定することも可能です。
サンプルコードでは、まず秘密鍵と公開鍵のペアを一時的に生成し、秘密鍵を使って元のデータにデジタル署名を生成しています。次に、openssl_verify関数を呼び出し、元のデータ、生成された署名、公開鍵、および使用したハッシュアルゴリズム(ここではOPENSSL_ALGO_SHA256)を渡して検証を行います。
検証が成功し、データが改ざんされていない場合は戻り値として1が返されます。一方、データが署名後に変更されていたり、署名自体が不正であったりした場合は、戻り値は0となり検証失敗を示します。何らかのエラーが発生した際には-1またはfalseが返されます。このように、openssl_verifyはセキュリティ上重要なデータの検証に役立つ関数です。
openssl_verify関数は、データのデジタル署名が有効であるかを公開鍵を用いて検証する際に利用されます。署名を生成した際と検証する際で、必ず同じハッシュアルゴリズムを指定してください。この関数の戻り値は、検証成功が1、検証失敗が0、処理中のエラーが-1と、それぞれ異なる意味を持つため、結果に応じて適切に判定することが重要です。エラーが発生した場合は、openssl_error_string()関数で詳細なエラーメッセージを確認し、原因究明に役立ててください。サンプルコードでは鍵を動的に生成していますが、実際のシステムでは秘密鍵を厳重に管理し、安全な方法でファイルから読み込むなどしてください。この機能は、データの改ざんを検知し、その整合性を保証するために不可欠です。