PHP 개발에서는 종종 문자열, 특히 암호, 해시 값, 서명 등과 같은 안전한 민감한 데이터를 처리 할 때 일반적으로 개발자가 간단한 문자열 비교에 "=="를 사용할 수 있습니다. 그러나 HASH 문자열에 대해 논의 할 때 PHP는 비교를위한 특수 함수 Hash_equals ()를 제공합니다. PHP가 Hash_equals () 대신 "=="를 사용하지 않는 이유는 무엇입니까? 그러나 후자를 추천합니까? 이에 대한 이유에 대해 논의합시다.
PHP에서 ==는 느슨한 비교 연산자이므로 피연산자의 유형에 따라 비교하기 위해 오페라를 자동으로 변환합니다. 이 동작은 숫자와 문자열을 다룰 때 예상치 못한 결과로 이어질 수 있습니다. 예를 들어:
<span><span><span class="hljs-variable">$hash1</span></span><span> = </span><span><span class="hljs-string">"abc"</span></span><span>;
</span><span><span class="hljs-variable">$hash2</span></span><span> = </span><span><span class="hljs-string">"a"</span></span><span> . </span><span><span class="hljs-string">"bc"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$hash1</span></span><span> == </span><span><span class="hljs-variable">$hash2</span></span><span>); </span><span><span class="hljs-comment">// 산출: bool(true)</span></span><span>
</span></span>위의 예에서, $ hash1 과 $ hash2는 처음에는 동일하게 보이지 않지만, PHP는 느슨한 비교를 할 때 유형 변환을 수행하기 때문에 두 줄이 같다고 가정합니다.
더 중요한 것은 PHP가 두 줄의 문자가 다르다는 것이 발견 될 때까지 문자열의 각 문자를 비교하려고 시도한다는 것입니다. 그러나 해시 값은 이진 데이터의 표현이며 보안 측면에서 각 문자에 대한 엄격한 요구 사항이 매우 높기 때문에 이러한 느슨한 비교는 해시 값에 적용되지 않습니다. 약간의 차이가 있더라도 해시 값은 다른 것으로 간주되어야합니다. 따라서 ==는 해시 비교에 적합하지 않습니다.
== 와 달리 Hash_equals ()는 해시 값 비교를 위해 특별히 설계되었습니다. 그것은 매우 엄격하게 행동하고, 유형 변환을 수행하지 않으며, 느슨한 PHP 비교의 영향을받지 않습니다. Hash_equals ()는 두 줄의 내용을 확인하여 정확히 동일합니다. 차이가있는 경우 즉시 False를 반환하고 문자열의 유형 또는 기타 요인으로 인해 오류가 없습니다.
또한 Hash_equals ()는 타이밍 공격을 방지하는 데 문제가 있습니다. 타이밍 공격은 작동 시간 차이를 사용하여 민감한 데이터를 추측하는 공격 방법입니다. 해시 값을 직접 비교하기 위해 ==를 사용하면 PHP는 비교 과정에서 일부 정보를 누출 할 수 있으며 공격자는 신중한 관찰을 통해 다른 해시 값의 차이를 유추 할 수 있습니다. Hash_equals ()는 모든 문자를 비교 한 후 결과를 제공 하므로이 보안 취약점을 피할 수 있습니다.
==는 느슨한 비교이기 때문에 해시 값을 처리 할 때 예측할 수없는 행동을 경험할 수 있습니다. 예를 들어, 해시 비교를 수행 할 때 "=="을 사용하고 입력 해시 문자열 길이가 일치하지 않으면 PHP가 채워져 불필요한 일치가 발생할 수 있습니다. Hash_equals () 에는 그러한 문제가 없을 것입니다.이 문제는 두 줄의 각 바이트를 정확하게 비교하여 정확히 일관성을 유지합니다.
해시 값을 비교하기 위해 ==를 사용하는 위험 중 하나는 문자열 길이에 대한 정보를 누출 할 수 있다는 것입니다. PHP가 두 개의 해시 문자열을 비교하여 다른 문자열 처리 알고리즘이나 문자 변환을 사용하는 경우, 공격자는 시간 차이를 통해 정보를 추측 할 수 있습니다.
Hash_equals ()는 일정한 시간 비교를 제공합니다. 즉, 입력 문자열의 실행 시간은 동일하므로 타이밍 공격을 방지하는 데 매우 중요합니다.
hash_equals () 의 구현은 == 보다 약간 느리게 일 수 있지만, 보안 우위는이 성능 오버 헤드를 훨씬 능가합니다. 특히 암호 또는 민감한 데이터를 다룰 때 보안은 항상 성능보다 우선해야합니다. 따라서 == 가 경우에도 더 빨리 실행 되더라도 해시 비교에 hash_equals ()를 사용하는 것이 좋습니다.
또한 PHP는 Hash_equals ()를 구현할 때 성능 최적화를 수행하여 대부분의 경우 효율적으로 수행되고 있는지 확인했습니다.
PHP에서 "=="는 일반적인 비교 연산자이지만 특히 보안 요구 사항이 높은 상황에서 해시 비교에 적합하지 않습니다. Hash_equals () 는 해시 비교를 위해 특별히 설계되었으며, 이는 더욱 엄격하고 안전한 검증을 제공하고 느슨한 비교로 인해 발생할 수있는 문제를 피할 수 있습니다. 코드의 보안, 특히 암호, API 키 또는 디지털 서명과 같은 민감한 데이터와 관련하여 개발자는 항상 해시 비교에 == 대신 hash_equals ()를 사용해야합니다.