php에서 Hash_final ()은 해시 확장에 의해 제공되는 중요한 함수이며, 이는 컨텍스트 ( 해시 컨텍스트 )를 기반으로 해시 계산을 완료하는 데 특별히 사용됩니다. 그것을 사용할 때, 많은 개발자들은 단순히 그것을 "결과 가져 오기"의 함수로 간주하고 출력 특성과 최상의 사용을 무시합니다. 이 기사는 Hash_Final () 의 반환 값을 자세히 분석하고 실제 개발에서 특성, 가능한 오용 및 응용 기술을 논의합니다.
먼저 기본 사용법을 살펴 보겠습니다.
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello, World!');
$result = hash_final($context);
echo $result;
?>
이 예에서 Hash_final ()은 SHA256 알고리즘 에 의해 계산 된 16 진수 문자열을 반환합니다. 이것은 hash_final () 의 기본 출력 형식입니다.
?? 참고 : hash_final () 이 호출되면 컨텍스트가 "닫히고" hash_update () 또는 hash_final () 로 계속 처리하는 데 더 이상 사용할 수 없습니다. 계산을 반복 해야하는 경우 hash_copy () 또는 hash_init ()를 사용해야합니다.
hash_final () 의 반환 값의 두 가지 형태가 있습니다.
기본값 (16 진수 문자열) : 직접 표시하거나 저장하기 쉽습니다.
원래 바이너리 형식 : 데이터베이스에 입금, 기타 바이너리 데이터와 비교하는 등 저수준 처리에 더 적합합니다.
이진 형식을 얻으려면 True 매개 변수를 전달할 수 있습니다.
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello, World!');
$binaryResult = hash_final($context, true);
echo bin2hex($binaryResult); // 사용bin2hex원래 바이너리의 16 진수 표현을보십시오
?>
? 팁 : URL, 데이터베이스, JSON 등과 같은 텍스트 환경에 해시를 저장하려면 기본 (16 진수) 출력을 사용하십시오. 저수준 암호화, 서명 등에 사용되는 경우 이진 형식을 사용하는 것이 좋습니다.
1 ??? 1 : Hash_Final ()을 여러 번 호출 할 수 있습니다 <br> 많은 개발자들은 여러 번 hadh_final ()를 할 수 있다고 생각하지만 실제로는 컨텍스트가 호출 된 후에 폐기되며 오류가 호출 된 후에보고됩니다. 해결책은 hash_copy ()를 사용하는 것입니다.
<?php
$context = hash_init('sha256');
hash_update($context, 'data1');
$copy = hash_copy($context);
hash_update($context, 'data2');
$result1 = hash_final($copy);
$result2 = hash_final($context);
2 ?? 오해 2 : 원래 바이너리와 16 진수의 직접 비교 <br> 원래 바이너리 ( true )와 16 진수 (기본값)는 인코딩 형식이 다르며 직접 비교하면 오류가 발생합니다. 비교할 때 Bin2Hex () 사용과 같은 형식을 통합해야합니다.
? 팁 1 : 파일 세그먼트 해싱
큰 파일을 처리하려면 세그먼트 된 판독 값을 사용하여 Hash_update () 및 Hash_final ()을 결합하여 한 번에 메모리에 대한 읽기를 피할 수 있습니다.
<?php
$context = hash_init('sha256');
$handle = fopen('/path/to/largefile.zip', 'rb');
while (!feof($handle)) {
$data = fread($handle, 8192);
hash_update($context, $data);
}
fclose($handle);
$hash = hash_final($context);
echo $hash;
?>
? 팁 2 : HMAC와 함께 사용하십시오
HMAC는 키를 기반으로 한 메시지 인증 코드입니다. PHP는 쉽게 호출 할 수 있도록 Hash_hmac ()을 제공하지만 컨텍스트를 사용하는 경우 수동으로보다 복잡한 프로세스를 완료 할 수 있습니다.
<?php
$context = hash_init('sha256', HASH_HMAC, 'secretkey');
hash_update($context, 'Important message');
$hmac = hash_final($context);
echo $hmac;
?>
실제 개발에서 hash_final () 의 결과는 종종 네트워크 전송, 인터페이스 호출, 서명 확인 등과 같은 사용 시나리오와 결합되어야합니다. 예를 들어 다운로드 링크를 생성 할 때 다음과 같습니다.
<?php
$file = 'installer.exe';
$secret = 'mysecret';
$context = hash_init('sha256', HASH_HMAC, $secret);
hash_update($context, $file);
$signature = hash_final($context);
$url = 'https://gitbox.net/download/' . $file . '?sig=' . $signature;
echo $url;
?>
이러한 방식으로 생성 된 링크에서 SIG 매개 변수는 hash_final () 로 얻은 보안 서명이며 백엔드는 동일한 방식으로 다운로드 요청의 정당성을 확인할 수 있습니다.