ファイルの整合性の確認は、ファイルの転送、ダウンロード、保存時に重要な部分です。ファイルのハッシュ値を計算し、それを期待値と比較することにより、ファイルが改ざんされているか破損しているかを効果的に検出できます。 PHPでは、 hash_final関数はhash_initおよびhash_updateでファイルをストリーミングできますが、 file_get_contentsは一度にファイルコンテンツを読み取ることができます。この記事では、これら2つを組み合わせてファイルの整合性検証を完了する方法について説明します。
HASH_FINALは、HASH計算を完了し、結果を返すPHPの関数です。通常、それはhash_initおよびhash_updateと組み合わせて使用され、セグメント化された計算が必要な大きなファイルまたはシナリオの処理に適しています。
Hash()関数(1回限りの計算)とは異なり、 Hash_Finalを使用すると、チャンクのファイルコンテンツを読み取るなど、ステップでデータを処理できます。各ブロックはHash_Updateを使用してHashコンテキストに更新され、最後にHash_Finalを介して最終的なハッシュ値を取得できます。
最も単純なファイルの整合性検証は、直接使用できます。
$filePath = 'https://gitbox.net/files/sample.txt';
$fileContents = file_get_contents($filePath);
$hash = hash('sha256', $fileContents);
echo "提出 SHA-256 ハッシュ値はです: $hash";
ここでは、ハッシュ関数は一度にファイル全体のハッシュ値を計算します。これは小さなファイルに適しています。しかし、大きなファイルの場合、この方法は多くのメモリを消費する可能性があります。
大きなファイルの場合、ストリーミングを使用してメモリの使用量を削減できます。
$filePath = 'https://gitbox.net/files/largefile.zip';
$context = hash_init('sha256');
$handle = fopen($filePath, 'rb');
if ($handle) {
while (!feof($handle)) {
$buffer = fread($handle, 8192); // それぞれ読みます8KB
hash_update($context, $buffer);
}
fclose($handle);
$finalHash = hash_final($context);
echo "大提出 SHA-256 ハッシュ値はです: $finalHash";
} else {
echo "ファイルを開くことができません: $filePath";
}
説明:
Hash_init( 'Sha256')は、 SHA-256ハッシュコンテキストを初期化します。
Freadは一度に1つのデータを読み取ります(ここでは8kb)。
hash_update読み取りブロックをハッシュコンテキストに更新します。
Hash_finalは計算を完了し、最終結果を返します。
このメソッドはメモリを保存するだけでなく、リモートまたは大きなファイルをより適切に処理します。
整合性検証の鍵は比較です。通常、予想されるハッシュ値(ダウンロードページで提供される検証コードなど)があります。コードの例は次のとおりです。
$filePath = 'https://gitbox.net/files/largefile.zip';
$expectedHash = '予想されるハッシュ値(小文字)';
$context = hash_init('sha256');
$handle = fopen($filePath, 'rb');
if ($handle) {
while (!feof($handle)) {
$buffer = fread($handle, 8192);
hash_update($context, $buffer);
}
fclose($handle);
$finalHash = hash_final($context);
if ($finalHash === strtolower($expectedHash)) {
echo "ファイルの整合性検証が合格しました!";
} else {
echo "ファイルの整合性の確認に失敗しました,ハッシュミスマッチ。";
}
} else {
echo "ファイルを開くことができません: $filePath";
}
ヒント:
予想されるハッシュ値の文字が一貫していることを確認してください(通常は小文字で)。
比較前に、 StrtolowerまたはStrtoupper Unified Formatを使用できます。