現在の位置: ホーム> 最新記事一覧> hash_finalを使用して署名を生成するときにメッセージの整合性を処理する方法は?

hash_finalを使用して署名を生成するときにメッセージの整合性を処理する方法は?

gitbox 2025-05-27

PHPでは、 hash_finalはhash_inithash_updateで使用される重要な関数です。これは、主にハッシュダイジェスト(つまり、署名)を生成して、データの整合性を検証するために使用されます。この記事では、 hash_finalを正しく使用して署名を生成し、送信またはストアドプロシージャ中にメッセージの整合性を確保する方法を詳細に説明します。

1 ?? hash_finalとは何ですか?

HASH_FINALは、PHPが提供するハッシュ拡張機能の関数であり、ステップバイステップハッシュ操作を完了し、結果を返すために使用されます。その基本的なワークフローは次のとおりです。

  1. hash_initを使用してハッシュコンテキストを初期化します。

  2. HASH_UPDATEを使用して、データをコンテキストにハッシュする必要があるようにデータを追加します(大規模なデータブロックを処理するために複数回呼び出すことができます)。

  3. hash_finalを使用して、最終的なハッシュ値(署名)を取得します。

この段階的なアプローチは、コンテンツ全体を一度にメモリにロードする必要がないため、大きなファイルやストリーミングデータの処理に特に適しています。

2 ??コード例:署名を生成する方法

メッセージへの署名をシミュレートする簡単な例を見てみましょう。

 <?php
$message = 'これは署名を必要とするメッセージです';
$algo = 'sha256';

// ハッシュコンテキストを初期化します
$context = hash_init($algo);

// ハッシュコンテキストを更新します,データは複数回追加できます
hash_update($context, $message);

// 最終的な署名を取得します(まとめ)
$signature = hash_final($context);

// 出力署名
echo "サイン: " . $signature . "\n";
?>

この例では、 SHA256アルゴリズムを使用して、メッセージのダイジェストを生成します。出力は、16進エンコードされたハッシュ値です。これは、受信側のメッセージの整合性を検証するために使用できます。

3 ??メッセージの整合性を確保する方法

署名を生成するだけでは不十分です。鍵は、署名を確認する方法です。通常、完全なプロセスは、次の手順で構成されています。

1 ??送信

  • 署名を生成します。

  • メッセージと署名を受信機に送信します。

2 ??受信者

  • 受信したメッセージ。

  • 同じアルゴリズムを使用してメッセージの署名を再生します。

  • 受信した署名が計算された署名と一致するかどうかを比較します。

コードの例(受信者検証):

 <?php
$received_message = 'これは署名を必要とするメッセージです';
$received_signature = '发送端提供的サイン';
$algo = 'sha256';

// 重新计算サイン
$context = hash_init($algo);
hash_update($context, $received_message);
$calculated_signature = hash_final($context);

// 比较サイン
if (hash_equals($received_signature, $calculated_signature)) {
    echo "メッセージは完了しました,改ざんされていません。\n";
} else {
    echo "警告:メッセージは改ざんされている可能性があります!\n";
}
?>

==を直接使用する代わりに、 hash_equalsを使用して署名を比較すると、時間攻撃を防ぐことができます。

4 ??実用的なケース:ファイルのダウンロード確認

ユーザーにhttps://gitbox.net/download/file.zipからファイルをダウンロードして、検証のためにハッシュ値を提供したいとします。これを実行できます。

 <?php
$file = 'file.zip';
$algo = 'sha256';

// ファイルストリーミングを開きます
$context = hash_init($algo);
$handle = fopen($file, 'rb');

while (!feof($handle)) {
    $data = fread($handle, 8192);
    hash_update($context, $data);
}
fclose($handle);

// 获取文件的サイン(ハッシュ値)
$hash = hash_final($context);

echo "ダウンロードリンク: https://gitbox.net/download/file.zip\n";
echo "ファイルハッシュ(完全性を検証するために使用されます): $hash\n";
?>

ダウンローダーは、同じアルゴリズムを使用して、ダウンロードされたファイルハッシュ値を計算して、提供された値と一致していることを確認し、ファイルが完了し、改ざんされていないことを確認できます。