多くのアプリケーションでは、ファイルの整合性を確認することが非常に重要です。特に、ファイルをダウンロードまたはアップロードする必要がある場合は、ファイルが改ざんまたは破損していないことを確認することが非常に重要です。 PHPは、 Hash_update_streamとhash_equals()が一般的に使用される2つの関数であるファイルハッシュチェックを実行するためのさまざまな方法を提供します。
この記事では、 hash_update_stream関数を使用してファイルを徐々に読み取り、ハッシュ値を計算する方法を紹介し、 Hash_equals()関数を使用して、計算されたハッシュ値を予想ハッシュ値と比較してファイルの整合性を確認します。
hash_update_stream :この関数は、データストリームのハッシュ値を計算するために使用されます。大きなファイルを処理する場合、チャンクでファイルを読み取り、ハッシュ値を徐々に更新することにより、メモリオーバーフローの問題を効果的に回避できます。
Hash_equals :これは、2つのハッシュ値を比較するための安全な機能です。タイミング攻撃を防ぎ、 ==または==を使用するよりも安全です。これは、ハッシュ値の長さが異なるために時差を露出しないためです。
すでにファイルと予想されるハッシュ値があると仮定すると、以下の手順に従ってファイルの整合性を確認する必要があります。
まず、検証するにはファイルを開く必要があります。 Fopen()を使用して、読み取りのためにファイルを開くことができます。
$file = fopen('path/to/your/file', 'rb');
次に、 hash_init()を使用して、ハッシュコンテキストを初期化します。ここでは、 SHA256を例として取り上げます。もちろん、他のハッシュアルゴリズム( MD5 、 SHA512など)を使用することもできます。
$hashContext = hash_init('sha256');
チャンクでファイルを読み取り、 hash_update_stream()関数を介して各ブロックのデータをハッシュコンテキストに更新します。
while (!feof($file)) {
$data = fread($file, 8192); // 読む8KBデータブロック
hash_update_stream($hashContext, $data);
}
ファイルが読み取られたら、 hash_final()を使用して計算されたファイルハッシュ値を取得します。
$fileHash = hash_final($hashContext);
最後に、 hash_equals()を使用して、計算されたファイルハッシュ値を予想ハッシュ値と安全に比較して、ファイルが改ざんされていないことを確認します。
$expectedHash = '予想されるハッシュ値'; // サーバーまたは他の安全な場所からこのハッシュ値を取得できます
if (hash_equals($fileHash, $expectedHash)) {
echo "ファイルが完了します,ハッシュ値マッチング!";
} else {
echo "ファイルは破損または改ざんされます,ハッシュ値は一致しません!";
}
これが完全なサンプルコードです:
<?php
// ファイルを開きます
$file = fopen('path/to/your/file', 'rb');
if (!$file) {
die('无法ファイルを開きます');
}
// ハッシュコンテキストを初期化します
$hashContext = hash_init('sha256');
// 逐步読む文件并更新哈希值
while (!feof($file)) {
$data = fread($file, 8192);
hash_update_stream($hashContext, $data);
}
// ファイルのハッシュ値を取得します
$fileHash = hash_final($hashContext);
// 予想されるハッシュ値
$expectedHash = '予想されるハッシュ値'; // 例えば,'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
// ハッシュ値を比較します
if (hash_equals($fileHash, $expectedHash)) {
echo "ファイルが完了します,ハッシュ値マッチング!";
} else {
echo "ファイルは破損または改ざんされます,ハッシュ値は一致しません!";
}
// ファイルを閉じます
fclose($file);
?>