현대 웹 개발에서 데이터 무결성 검증은 매우 중요한 작업입니다. 데이터 전송 또는 스토리지 중에 데이터가 변조되거나 손상되지 않도록해야합니다. PHP는 개발자 가이 요구 사항을 달성 할 수 있도록 다양한 해시 관련 기능을 제공하며, 그 중 hash_final () 중 해시 컨텍스트 처리에 사용되는 핵심 기능 중 하나입니다. 이 기사는 Hash_Final () 의 목적, 작동 원리 및 데이터 무결성 검증을 위해 실제 프로젝트에서 사용하는 방법에 대해 자세히 분석합니다.
Hash_final ()은 PHP가 제공 한 해시 확장에서 증분 해시 작업에서 최종 해시 값을 얻기 위해 함수입니다. 일반적으로 hash_init () 및 hash_update () 와 함께 사용되며 세그먼트에서 해시 값을 계산 해야하는 큰 파일 또는 시나리오를 처리하는 데 적합합니다.
기본 사용 :
string hash_final ( HashContext $context [, bool $raw_output = false ] )
$ 컨텍스트 : hash_init () 에 의해 생성 된 해시 컨텍스트.
$ raw_output (선택 사항) : true 인 경우 원래 바이너리 형식으로 해시 값을 출력하고 그렇지 않으면 16 진수 문자열을 출력합니다.
Hash () 함수는 한 번에 문자열 또는 파일의 해시 값을 계산할 수 있지만 Hash_Final () 은 다음 시나리오에서 더 적합합니다.
큰 파일 또는 스트리밍 데이터 처리 :
전체 파일을 한 번에 메모리로 읽으면 메모리 오버플로가 발생할 수 있으며 Hash_Init () + hash_update ()를 사용하면 세그먼트에서 파일을 읽고 해시를 단계별로 업데이트 할 수 있습니다.
다단계 처리 :
데이터가 청크 (예 : 네트워크 스트림 또는 분산 시스템의 조각난 데이터)로 수신되면 해시를 점차 업데이트 할 수 있으며 최종적으로 Hash_Final ()을 사용하여 결과를 생성 할 수 있습니다.
보다 유연한 제어 :
해싱 알고리즘을 동적으로 선택할 수 있으며 중간의 비즈니스 요구에 따라 처리 로직을 조정할 수 있습니다.
다음은 파일 무결성을 확인하기 위해 hash_final ()을 사용하는 예입니다.
<?php
$file = 'largefile.zip';
$expectedHash = 'e99a18c428cb38d5f260853678922e03'; // 예상되는MD5해시 가치
$context = hash_init('md5');
$handle = fopen($file, 'rb');
if (!$handle) {
die("파일을 열 수 없습니다: $file");
}
while (!feof($handle)) {
$data = fread($handle, 8192); // 각각 읽습니다8KB
hash_update($context, $data);
}
fclose($handle);
$calculatedHash = hash_final($context);
if ($calculatedHash === $expectedHash) {
echo "파일 무결성 확인이 통과되었습니다。";
} else {
echo "파일이 손상되거나 변조되었습니다。";
}
?>
원격 파일의 무결성을 확인 해야하는 경우 fopen ()을 사용하여 원격 스트림을 열 수 있습니다 ( allow_url_fopen이 활성화되어 있는지 확인) :
<?php
$url = 'https://gitbox.net/files/sample.zip';
$expectedSha256 = '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08';
$context = hash_init('sha256');
$handle = fopen($url, 'rb');
if (!$handle) {
die("열 수 없습니다URL: $url");
}
while (!feof($handle)) {
$data = fread($handle, 8192);
hash_update($context, $data);
}
fclose($handle);
$calculatedSha256 = hash_final($context);
if ($calculatedSha256 === $expectedSha256) {
echo "远程파일 무결성 확인이 통과되었습니다。";
} else {
echo "远程파일이 손상되거나 변조되었습니다。";
}
?>