現在の位置: ホーム> 最新記事一覧> hash_equals()と組み合わせてファイルハッシュ値を検証する方法

hash_equals()と組み合わせてファイルハッシュ値を検証する方法

M66 2025-05-27

多くのアプリケーションでは、ファイルの整合性を確認することが非常に重要です。特に、ファイルをダウンロードまたはアップロードする必要がある場合は、ファイルが改ざんまたは破損していないことを確認することが非常に重要です。 PHPは、 Hash_update_streamhash_equals()が一般的に使用される2つの関数であるファイルハッシュチェックを実行するためのさまざまな方法を提供します。

この記事では、 hash_update_stream関数を使用してファイルを徐々に読み取り、ハッシュ値を計算する方法を紹介し、 Hash_equals()関数を使用して、計算されたハッシュ値を予想ハッシュ値と比較してファイルの整合性を確認します。

hash_update_streamhash_equals()とは何ですか?

  • hash_update_stream :この関数は、データストリームのハッシュ値を計算するために使用されます。大きなファイルを処理する場合、チャンクでファイルを読み取り、ハッシュ値を徐々に更新することにより、メモリオーバーフローの問題を効果的に回避できます。

  • Hash_equals :これは、2つのハッシュ値を比較するための安全な機能です。タイミング攻撃を防ぎ、 ==または==を使用するよりも安全です。これは、ハッシュ値の長さが異なるために時差を露出しないためです。

hash_update_streamhash_equals()を使用してファイルハッシュ値を検証する方法は?

すでにファイルと予想されるハッシュ値があると仮定すると、以下の手順に従ってファイルの整合性を確認する必要があります。

ステップ1:ファイルを開きます

まず、検証するにはファイルを開く必要があります。 Fopen()を使用して、読み取りのためにファイルを開くことができます。

 $file = fopen('path/to/your/file', 'rb');

ステップ2:ハッシュコンテキストを初期化します

次に、 hash_init()を使用して、ハッシュコンテキストを初期化します。ここでは、 SHA256を例として取り上げます。もちろん、他のハッシュアルゴリズム( MD5SHA512など)を使用することもできます。

 $hashContext = hash_init('sha256');

ステップ3:ファイルを段階的に読み、ハッシュ値を更新します

チャンクでファイルを読み取り、 hash_update_stream()関数を介して各ブロックのデータをハッシュコンテキストに更新します。

 while (!feof($file)) {
    $data = fread($file, 8192); // 読む8KBデータブロック
    hash_update_stream($hashContext, $data);
}

ステップ4:ファイルの最終的なハッシュ値を計算します

ファイルが読み取られたら、 hash_final()を使用して計算されたファイルハッシュ値を取得します。

 $fileHash = hash_final($hashContext);

ステップ5:ファイルハッシュを予想ハッシュと比較します

最後に、 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);

?>