해시 함수는 데이터 무결성 확인 또는 비밀번호 확인을 수행 할 때 매우 일반적인 도구입니다. 그러나 단순히 해시 비교 (예 : == 또는 === )를 사용한다고해서 잠재적 해시 충돌을 방지하고 효과적으로 감지하지는 않습니다. 보안을 개선하기 위해 PHP는 Hash_Final 과 Hash_equals 의 두 가지 기능을 제공하여 개발자가 해시 운영을보다 안전하게 처리하는 데 도움이됩니다.
이 기사는이 두 기능의 사용법을 소개하고 실용적인 예를 사용하여 해시 충돌 감지를 달성하는 방법을 보여줍니다.
Hash_Final은 Hash_Init 및 Hash_update를 사용하여 단계별 해시 계산을 생성 할 때 마지막 단계입니다. 최종 해시 값을 반환합니다.
예:
<?php
$context = hash_init('sha256');
hash_update($context, 'hello');
$hash = hash_final($context);
echo $hash;
여기서는 Hash_init 로 SHA-256의 해시 컨텍스트를 초기화 한 다음 Hash_update를 사용하여 데이터를 해시로 추가하고 마지막으로 Hash_Final을 사용하여 최종 해시 결과를 얻습니다.
Hash_equals는 두 개의 해시 값을 안전하게 비교하는 데 사용됩니다. ==를 직접 사용하는 것과 달리 문자열 비교로 인한 타이밍 공격을 조기에 방지 할 수 있습니다. 타이밍 공격은 작업에 필요한 시간을 측정하여 민감한 정보를 지정하는 공격 방법입니다.
예:
<?php
$knownHash = hash('sha256', 'known_value');
$userInputHash = hash('sha256', $_POST['input']);
if (hash_equals($knownHash, $userInputHash)) {
echo '성공적으로 일치합니다!';
} else {
echo '경기가 실패했습니다。';
}
여기서, 사용자가 입력 한 값이 올바른 값의 일부일 경우에도 Hash_equals는 비교 과정에서 시차를 누출하지 않도록 바이트 바이트를 완전히 비교합니다.
사용자가 제출 한 데이터가 해시의 기존 데이터와 충돌하는지 여부를 감지해야한다고 가정합니다 (즉, 다른 데이터가 동일한 해시 값을 생성). 우리는 이것을 할 수 있습니다 :
Hash_init , Hash_update 및 Hash_final을 사용하여 기존 데이터의 해시를 계산하십시오.
동일한 방식으로 사용자 데이터 해시를 계산하십시오.
Hash_equals를 사용하여 두 개의 해시 값을 비교하십시오.
샘플 코드 :
<?php
// 기존 데이터를 시뮬레이션합니다
$existingData = 'Original content';
$context1 = hash_init('sha256');
hash_update($context1, $existingData);
$existingHash = hash_final($context1);
// 사용자가 제출 한 데이터
$userData = $_POST['user_data'];
$context2 = hash_init('sha256');
hash_update($context2, $userData);
$userHash = hash_final($context2);
// 해시 값을 비교하십시오
if (hash_equals($existingHash, $userHash)) {
echo '해시 충돌이 감지되었습니다!데이터는 동일하거나 동일한 해시 값을 생성 할 수 있습니다.。';
} else {
echo '未해시 충돌이 감지되었습니다。';
}
알아채다:
검출 된 동일한 해시 값은 데이터가 동일하기 때문에 이론적으로 해시 충돌로 인한 것일 수도 있습니다. 따라서,이 검출 방법은 데이터 일관성을 판단하기 위해 해시에 전적으로 의존하기보다는 방어 또는 검증에 더 적합합니다.
Hash_final 및 Hash_equals를 사용하여 해시를 안전하게 계산하고 비교할 수있을뿐만 아니라 타이밍 공격을 방지하고 잠재적 해시 충돌을 어느 정도 감지 할 수 있습니다. 보안과 관련된 시나리오에서는 간단한 문자열 비교 대신 이러한 도구를 사용하는 것이 좋습니다.
예를 들어 실제 응용 분야에서 :
업로드 된 파일의 무결성을 확인하십시오
비밀번호 확인 ( password_hash 및 password_verify 와 함께 사용)
인터페이스 호출의 서명을 감지하십시오
이러한 기능은 모두 보안을 향상시키는 데 사용될 수 있습니다.
더 알고 싶다면 공식 PHP 문서를 확인하는 것이 좋습니다.