파일 무결성 확인은 파일을 전송, 다운로드 또는 저장할 때 중요한 부분입니다. 파일의 해시 값을 계산하고이를 예상 값과 비교함으로써 파일이 변조되었는지 또는 손상되었는지를 효과적으로 감지 할 수 있습니다. PHP에서 Hash_Final 함수는 Hash_init 및 Hash_update 로 파일을 스트리밍 할 수있는 반면 File_Get_Contents는 파일 내용을 한 번에 읽을 수 있습니다. 이 기사는이 두 가지를 결합하여 파일 무결성 확인을 완료하는 방법을 안내합니다.
Hash_Final은 해시 계산을 완료하고 결과를 반환하는 PHP의 함수입니다. 일반적으로 Hash_init 및 Hash_update 와 함께 사용되며 세그먼트 된 계산이 필요한 대형 파일 또는 시나리오를 처리하는 데 적합합니다.
hash () 함수 (일회성 계산)와 달리 Hash_Final을 사용하면 청크의 파일 내용을 읽는 것과 같은 단계에서 데이터를 처리 할 수있게되면 각 블록은 hash_update를 사용하여 해시 컨텍스트로 업데이트되며 마지막으로 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는 한 번에 한 조각의 데이터를 읽습니다 (여기서 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 형식을 사용할 수 있습니다.