PHP에서 HASH_Final 함수는 증분 해시 컨텍스트를 완료하고 최종 해시 값을 반환하는 데 사용되는 도구입니다. 일반적으로 큰 데이터 또는 스트리밍 데이터의 해시 계산을 처리하기 위해 Hash_init , Hash_update 등과 같은 함수와 함께 사용됩니다. 그러나 많은 개발자들이 Hash_Final을 사용할 때 몇 가지 일반적인 문제가 발생합니다. 이 기사는 이러한 문제를 자세히 분석하고 솔루션을 제공합니다.
hash_final 의 정의는 다음과 같습니다.
string hash_final ( HashContext $context [, bool $raw_output = FALSE ] )
$ 컨텍스트 : Hash_init 에 의해 생성 된 해시 컨텍스트.
$ raw_output : true 로 설정된 경우 출력 RAW 바이너리 데이터; 그렇지 않으면 소문자 16 진수 문자열을 출력하십시오.
Simple example:
$context = hash_init('sha256');
hash_update($context, 'hello');
$finalHash = hash_final($context);
echo $finalHash;
현상:
Hash_Final 이 호출되면 관련 $ 컨텍스트가 유효하지 않습니다. 예를 들어 동일한 컨텍스트를 다시 사용하려고하면 다음과 같습니다.
$context = hash_init('sha256');
hash_update($context, 'hello');
$final1 = hash_final($context);
$final2 = hash_final($context); // 실수!
경고 또는 오류가 발생합니다.
해결책:
컨텍스트를 재사용 해야하는 경우 Hash_Final 전에 Hash_Copy 로 전화하십시오.
$context = hash_init('sha256');
hash_update($context, 'hello');
$contextCopy = hash_copy($context);
$final1 = hash_final($context);
$final2 = hash_final($contextCopy);
현상:
많은 사람들이 기본적으로 문자열 출력 만 사용하여 $ raw_output = true가 실제로 바이너리를 반환한다는 것을 무시합니다. Echo를 사용하여 직접 출력하면 다음과 같은 코드가 나타납니다.
$context = hash_init('sha256');
hash_update($context, 'hello');
$final = hash_final($context, true);
echo $final; // 쓰레기 코드가 표시 될 수 있습니다
해결책:
읽기 쉬운 컨텐츠를 표시하려면 Bin2Hex 또는 Base64_encode를 사용할 수 있습니다.
$final = hash_final($context, true);
echo bin2hex($final);
현상:
큰 파일 또는 빅 데이터 스트림에 해시를 사용할 때 Hash ()를 사용하여 많은 메모리를 소비합니다.
$hash = hash('sha256', file_get_contents('largefile.dat'));
해결책:
스트림을 위해 hash_init + hash_update를 사용하십시오.
$context = hash_init('sha256');
$handle = fopen('largefile.dat', 'rb');
while (!feof($handle)) {
$data = fread($handle, 8192);
hash_update($context, $data);
}
fclose($handle);
$finalHash = hash_final($context);
현상:
동일한 입력 데이터는 다른 언어 (예 : Python, node.js)에서 PHP에서 계산 된 해시 값과 일치하지 않습니다.
해결책:
확실하게 하다:
입력 인코딩은 일관성이 있습니다 (UTF-8 대 UTF-16).
추가 라인 브레이크 또는 공백이 있는지 여부.
같은 방식으로 계산했습니다 (원본 대 인코딩 된 텍스트).
예 : PHP를 사용하여 UTF-8 인코딩 된 문자열의 SHA-256 해시를 계산하십시오.
$context = hash_init('sha256');
hash_update($context, mb_convert_encoding($input, 'UTF-8'));
$finalHash = hash_final($context);
현상:
해시의 URL 검증을 받으면 정규화가 무시되어 동일한 주소에 대해 다른 해시가 발생합니다.
$url1 = 'https://gitbox.net/page';
$url2 = 'https://gitbox.net/page/';
해결책:
예를 들어 계산하기 전에 URL을 정규화하십시오.
function normalizeUrl($url) {
$parsed = parse_url($url);
$scheme = $parsed['scheme'] ?? 'http';
$host = $parsed['host'] ?? '';
$path = rtrim($parsed['path'] ?? '/', '/');
return "$scheme://$host$path";
}
$context = hash_init('sha256');
hash_update($context, normalizeUrl('https://gitbox.net/page/'));
$finalHash = hash_final($context);