PHPでは、デジタル署名は、データの整合性とID認証を確保するための重要な手段です。データ(ハッシュ)を消化し、秘密キーでダイジェストを暗号化することにより、送信者はデータが実際に送信され、送信中に改ざんされていないことを証明できます。この記事では、 HASH_FINALとOpenSSL_SIGN関数を組み合わせて、完全なデジタル署名プロセスを実装する方法について詳しく説明します。
PHPは、 HASH_INIT 、 HASH_UPDATE 、 HASH_FINALを含むハッシュダイジェストを生成するための一連の機能を提供します。これらの関数は、ストリーミング操作をサポートしており、大きなファイルまたはセグメントで送信されるデータの処理に適しています。
OpenSSL_SIGN秘密キーを使用してデータに署名して、不可逆暗号化ダイジェストを生成します。署名されたデータは、公開キーを使用して検証できます。
より大きな文字列コンテンツにデジタル的に署名する必要があると仮定して、簡単なシナリオで実証します。
$context = hash_init('sha256');
ここでは、SHA-256アルゴリズムを使用します。また、実際のニーズに基づいて他のアルゴリズムを選択することもできます。
$dataParts = [
'最初の段落,おそらくアップロードされたファイルの一部から。',
'2番目の段落,おそらくストリーミングまたはロギングの一部。',
'最後の段落,完全なデータブロックを構成します。'
];
foreach ($dataParts as $part) {
hash_update($context, $part);
}
このコードは、ビッグデータの処理方法をシミュレートし、 HASH_UPDATEセグメントを介してデータを追加します。これは、一度にメモリに読み込むことができないシナリオに適しています。
$finalDigest = hash_final($context, true); // 元のバイナリ形式を使用します
2番目のパラメーターをtrueに設定して、16進数文字列ではなく、署名の元のバイナリデータを取得できるようにすることに注意してください。
$privateKey = file_get_contents('/path/to/private_key.pem');
$pkeyid = openssl_pkey_get_private($privateKey);
if (!$pkeyid) {
die('秘密鍵の読み込みは失敗しました');
}
$signature = '';
if (!openssl_sign($finalDigest, $signature, $pkeyid, OPENSSL_ALGO_SHA256)) {
die('署名が失敗しました');
}
openssl_free_key($pkeyid);
ここでは、DigestはOpenSSL_SIGNを介して秘密鍵を使用して署名され、同じアルゴリズムが指定されています(SHA-256)。
URL、JSON、またはその他の非バイナリチャネルで簡単に送信するために、署名をエンコードすることができます。
$encodedSignature = base64_encode($signature);
echo "署名された: " . $encodedSignature;
署名を確認するには、対応する公開キーとopensSl_verifyを使用できます。
$publicKey = file_get_contents('https://gitbox.net/keys/public_key.pem');
$pubkeyid = openssl_pkey_get_public($publicKey);
$isValid = openssl_verify($finalDigest, base64_decode($encodedSignature), $pubkeyid, OPENSSL_ALGO_SHA256);
if ($isValid === 1) {
echo "署名検証が成功しました";
} elseif ($isValid === 0) {
echo "無効な署名";
} else {
echo "検証プロセスでエラーが発生しました";
}
hash_init / hash_update / hash_finalとopenssl_signを組み合わせることにより、柔軟で安全なデジタル署名メカニズムを実装できます。この方法は、ビッグデータをセグメントで処理する必要があるシナリオに特に適しています。送信中にプライベートキーと署名データのセキュリティを保護し、システムの全体的な信頼チェーンが破壊されないようにしてください。