PHP에서 두 줄이 동일한지 여부를 비교해야 할 때 일반적으로 사용되는 방법은 strcmp 함수입니다. 그러나 보안 요구 사항이 증가함에 따라 PHP 5.6은 보안 비교를 위해 특별히 HASH_Equals 기능을 도입했습니다. 이 기사는이 두 기능의 차이점을 자세히 소개하고 일부 시나리오에서 Hash_equals가 권장되는 이유를 설명합니다.
strcmp (String $ str1, String $ str2) : int
STRCMP는 사전 순서에서 두 줄을 비교하는 데 사용됩니다. 정수 값을 반환합니다.
0은 두 줄이 정확히 동일하다는 것을 의미합니다.
음수는 첫 번째 문자열이 두 번째 문자열보다 작음을 나타냅니다.
양수 숫자는 첫 번째 문자열이 두 번째 문자열보다 크다는 것을 의미합니다.
hash_equals (String $ known_string, String $ user_string) : bool
Hash_equals는 두 줄이 정확히 동일인지 비교하는 데 특별히 사용되며 비교 프로세스는 타이밍 공격을 방지하는 안전한 방법입니다. 부울 가치를 반환합니다.
True는 두 줄이 정확히 동일하다는 것을 의미합니다
거짓은 불평등을 의미합니다
암호 해시, API 키, 서명 등과 같은 민감한 데이터를 확인하는 것과 같은 일부 보안 시나리오에서 공격자는 비교 함수의 실행 시간을 측정하여 문자열의 동일한 부분의 길이를 추론 한 다음 점차 올바른 키를 추측 할 수 있습니다. 일반 문자열 비교 함수 (예 : strcmp )는 첫 번째 다른 문자가 발견되면 즉시 반환되므로 비교 시간은 문자열의 부품 길이와 관련이 있으며, 이는 정보가 누출되기 쉬운다.
Hash_equals는 타이밍 공격을 방지하기 위해 특별한 고려 사항으로 설계되었습니다. 비교 시간은 두 문자열의 동일한 부분의 길이에 따라 변하지 않고 실행 시간을 수정하여 정보 누출 위험이 줄어 듭니다.
<?php
// 사용 strcmp 두 줄의 비교
$known = 'securetoken123';
$userInput = 'securetoken124';
if (strcmp($known, $userInput) === 0) {
echo "성공적으로 일치합니다(strcmp)";
} else {
echo "경기가 실패했습니다(strcmp)";
}
?>
<?php
// 사용 hash_equals 두 줄의 비교
$known = 'securetoken123';
$userInput = 'securetoken124';
if (hash_equals($known, $userInput)) {
echo "성공적으로 일치합니다(hash_equals)";
} else {
echo "경기가 실패했습니다(hash_equals)";
}
?>
위 코드의 문자열 비교에서 strcmp는 첫 번째 다른 문자로 즉시 반환되며 Hash_equals는 전체 비교를 수행합니다.
비밀번호 해시 확인 : 대부분의 비밀번호 검증이 Passwesp_verify를 통과하지만 직접 비교 해시를 구현하는 경우 Hash_equals를 사용하는 것이 좋습니다.
암호화 된 서명 : 예를 들어 HMAC, JWT 등과 비교하여 키를 추측하지 않도록하십시오.
비교 보안 토큰 : API 키, 액세스 토큰, 검증 코드 등
간단히 말해서, 보안 관련 문자열 비교에 hash_equals를 사용하는 것이 좋습니다.
Hash_equals는 통과 된 두 매개 변수가 문자열이며 길이가 같은 길이를 가지겠다고 요구합니다. 그렇지 않으면 False가 직접 반환됩니다.
Hash_equals를 사용하기 전에 입력 문자열이 문자열 유형이고 예상치 못한 오류를 피하기 위해 길이가 같은지 확인하는 것이 좋습니다.
STRCMP 는 일반적으로 사용되고 강력한 문자열 비교 함수이지만 안전하고 민감한 경우에는 시간이 정해진 공격을 방지하는 특성 때문에 더 적합한 선택입니다. Hash_equals 를 올바르게 사용하면 응용 프로그램의 보안을 효과적으로 향상시키고 잠재적 인 공격 위험을 피할 수 있습니다.