PHPでは、 hash_finalはhash_initとhash_updateで使用される重要な関数です。これは、主にハッシュダイジェスト(つまり、署名)を生成して、データの整合性を検証するために使用されます。この記事では、 hash_finalを正しく使用して署名を生成し、送信またはストアドプロシージャ中にメッセージの整合性を確保する方法を詳細に説明します。
HASH_FINALは、PHPが提供するハッシュ拡張機能の関数であり、ステップバイステップハッシュ操作を完了し、結果を返すために使用されます。その基本的なワークフローは次のとおりです。
hash_initを使用してハッシュコンテキストを初期化します。
HASH_UPDATEを使用して、データをコンテキストにハッシュする必要があるようにデータを追加します(大規模なデータブロックを処理するために複数回呼び出すことができます)。
hash_finalを使用して、最終的なハッシュ値(署名)を取得します。
この段階的なアプローチは、コンテンツ全体を一度にメモリにロードする必要がないため、大きなファイルやストリーミングデータの処理に特に適しています。
メッセージへの署名をシミュレートする簡単な例を見てみましょう。
<?php
$message = 'これは署名を必要とするメッセージです';
$algo = 'sha256';
// ハッシュコンテキストを初期化します
$context = hash_init($algo);
// ハッシュコンテキストを更新します,データは複数回追加できます
hash_update($context, $message);
// 最終的な署名を取得します(まとめ)
$signature = hash_final($context);
// 出力署名
echo "サイン: " . $signature . "\n";
?>
この例では、 SHA256アルゴリズムを使用して、メッセージのダイジェストを生成します。出力は、16進エンコードされたハッシュ値です。これは、受信側のメッセージの整合性を検証するために使用できます。
署名を生成するだけでは不十分です。鍵は、署名を確認する方法です。通常、完全なプロセスは、次の手順で構成されています。
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を使用して署名を比較すると、時間攻撃を防ぐことができます。
ユーザーに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";
?>
ダウンローダーは、同じアルゴリズムを使用して、ダウンロードされたファイルハッシュ値を計算して、提供された値と一致していることを確認し、ファイルが完了し、改ざんされていないことを確認できます。