現在の位置: ホーム> 最新記事一覧> hash_finalは、openssl_signを使用してどのようにデジタル署名を完了しますか?

hash_finalは、openssl_signを使用してどのようにデジタル署名を完了しますか?

gitbox 2025-05-26

PHPでは、デジタル署名は、データの整合性とID認証を確保するための重要な手段です。データ(ハッシュ)を消化し、秘密キーでダイジェストを暗号化することにより、送信者はデータが実際に送信され、送信中に改ざんされていないことを証明できます。この記事では、 HASH_FINALOpenSSL_SIGN関数を組み合わせて、完全なデジタル署名プロセスを実装する方法について詳しく説明します。

1。基本概念のレビュー

1。ハッシュシリーズ関数

PHPは、 HASH_INITHASH_UPDATEHASH_FINALを含むハッシュダイジェストを生成するための一連の機能を提供します。これらの関数は、ストリーミング操作をサポートしており、大きなファイルまたはセグメントで送信されるデータの処理に適しています。

2。OpenSSL_SIGN関数

OpenSSL_SIGN秘密キーを使用してデータに署名して、不可逆暗号化ダイジェストを生成します。署名されたデータは、公開キーを使用して検証できます。

2。署名プロセス手順

より大きな文字列コンテンツにデジタル的に署名する必要があると仮定して、簡単なシナリオで実証します。

1。ハッシュコンテキストを初期化します

$context = hash_init('sha256');

ここでは、SHA-256アルゴリズムを使用します。また、実際のニーズに基づいて他のアルゴリズムを選択することもできます。

2。セグメントのデータを更新します(ビッグデータ処理をシミュレート)

 $dataParts = [
    '最初の段落,おそらくアップロードされたファイルの一部から。',
    '2番目の段落,おそらくストリーミングまたはロギングの一部。',
    '最後の段落,完全なデータブロックを構成します。'
];

foreach ($dataParts as $part) {
    hash_update($context, $part);
}

このコードは、ビッグデータの処理方法をシミュレートし、 HASH_UPDATEセグメントを介してデータを追加します。これは、一度にメモリに読み込むことができないシナリオに適しています。

3。最終要約を生成します

$finalDigest = hash_final($context, true); // 元のバイナリ形式を使用します

2番目のパラメーターをtrueに設定して、16進数文字列ではなく、署名の元のバイナリデータを取得できるようにすることに注意してください。

4。秘密鍵で署名します

$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)。

5.署名を安全に送信または保存します

URL、JSON、またはその他の非バイナリチャネルで簡単に送信するために、署名をエンコードすることができます。

 $encodedSignature = base64_encode($signature);
echo "署名された: " . $encodedSignature;

3。署名検証(オプション)

署名を確認するには、対応する公開キーと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 "検証プロセスでエラーが発生しました";
}

4。概要

hash_init / hash_update / hash_finalopenssl_signを組み合わせることにより、柔軟で安全なデジタル署名メカニズムを実装できます。この方法は、ビッグデータをセグメントで処理する必要があるシナリオに特に適しています。送信中にプライベートキーと署名データのセキュリティを保護し、システムの全体的な信頼チェーンが破壊されないようにしてください。