현재 위치: > 최신 기사 목록> 암호 비교 및 ​​해당 솔루션에서 Hash_equals 기능의 일반적인 오류는 무엇입니까?

암호 비교 및 ​​해당 솔루션에서 Hash_equals 기능의 일반적인 오류는 무엇입니까?

gitbox 2025-06-27

PHP에서 Hash_equals 함수는 두 개의 해시 문자가 동일인지 안전하게 비교하는 데 사용되는 함수입니다. 원래 디자인은 시간 공격을 피하는 것입니다. 즉, 해커는 프로그램 응답 시간에 약간의 차이를 사용하여 암호가 올바른지 여부를 추론하는 것입니다. 그러나 실제로 사용하면 개발자는 종종 몇 가지 일반적인 실수를 저지르고 Hash_equals 기능이 예상되는 보안 효과를 달성하지 못하게합니다. 이 기사에서는 이러한 오류에 대해 자세히 설명하고 솔루션을 제공합니다.

1. 오해 : 일반 문자열과 혼란스러운 해시 _equals

Hash_equals 의 목적은 문자열과 비교하여 시차를 통해 암호 정보의 누출을 방지하는 것입니다. 전통적인 == 또는 === 운영자와 달리 Hash_equals는 비교 중에 문자열의 길이 또는 내용에 의존하지 않으므로 시간 공격을 피할 수 있습니다.

일반적인 실수 중 하나는 해시 _equals를 일반 문자열 비교 작업과 혼동하는 것입니다. 예를 들어:

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$password</span></span><span> == </span><span><span class="hljs-variable">$storedPasswordHash</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
}
</span></span>

여기서 해시 값을 비교하지만 PHP는 일반 비교 작업에 == 또는 ==를 사용하여 해시 값의 내용 또는 길이에 따라 다른 최적화를 만들어 시간 누출이 발생할 수 있습니다.

해결책:
해시 비교에 항상 해시를 사용하십시오.

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$storedPasswordHash</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
}
</span></span>

2. 오류 이해 : Hash_equals를 사용하여 원래 비밀번호 텍스트와 해시 값을 잘못 비교합니다.

또 다른 일반적인 실수는 원래 비밀번호를 저장된 해시 값과 비교할 때 hash_equals를 사용하는 것입니다. 이는 개발자가 암호 일반 텍스트를 해시 값과 직접 비교할 수 있다고 생각할 수있는 일반적인 오해입니다.

 <span><span><span class="hljs-comment">// 오류 데모</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT))) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
}
</span></span>

Password_hash는 해시 값을 반환하고 Hash_equals는 두 개의 해시 문자열 만 비교할 수 있으며 일반 텍스트와 해시를 직접 비교할 수 없기 때문에이 코드는 잘못되었습니다.

해결책:
비밀번호 클리어 텍스트와 해시 값은 적절한 기능 (예 : password_verify )을 사용하여 먼저 확인해야합니다. password_verify는 이 목적을 위해 설계된 기능입니다.

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$storedPasswordHash</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
}
</span></span>

3. 잘못된 사용 : 해시 값의 길이 일관성을 고려하지 않음

비교를 수행 할 때 해시 값 자체의 내용을 비교하는 것 외에도 두 해시 값의 길이가 동일한 지 확인합니다. 길이가 일관되지 않으면 해시 족은 불필요한 계산을 계속 수행하지 않도록 즉시 False를 반환합니다. 따라서 개발자는 들어오는 해시 값이 길이가 다르므로 오류가 발생한다는 것을 인식하지 못할 수도 있습니다.

예를 들어, 저장할 때 해시 (절단 또는 서식과 같은)에서 일부 처리를 수행하면 해시의 길이가 변경 될 수있어 비교가 실패합니다.

해결책:
해시를 저장하고 비교할 때 일관된 형식을 사용하여 불필요한 수정을 피하십시오. Password_hash 함수는 표준 해시 형식을 반환하고 수동 작동을 피하려고 노력합니다.

4. 잘못된 사용 : 다양한 유형의 해싱 알고리즘 비교

Hash_equals는 동일한 유형의 해시 값을 비교하는 데만 사용될 수 있습니다. 암호를 해시 할 때 (예 : MD5SHA256 사용) 다른 알고리즘을 사용하는 경우 해시 _equals 비교는 다른 해시 알고리즘 간의 비교를 처리 할 수 ​​없기 때문에 실패합니다.

 <span><span><span class="hljs-comment">// 오류 데모:md5 그리고 sha256 해시 비교</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>), </span><span><span class="hljs-title function_ invoke__">sha256</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>))) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
}
</span></span>

해결책:
비밀번호 저장 및 비교는 동일한 해싱 알고리즘을 사용하여 사용됩니다. Password_hash 함수를 사용하여 해시 값을 생성하는 경우 적절한 해신 알고리즘 (일반적으로 bcrypt 또는 argon2)을 사용하면 password_verify를 통해 확인하면됩니다.

5. 잘못된 사용 : Hash_equals 의 반환 값을 확인하지 마십시오.

Hash_equals는 두 해시 값이 동일인지를 나타내는 부울 값을 반환합니다. 개발자가 값의 올바른 처리를 무시하면 잘못된 논리적 판단으로 이어질 수 있습니다.

 <span><span><span class="hljs-comment">// 오류 데모:처리 된 반품 값이 없습니다</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$storedPasswordHash</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is incorrect!"</span></span><span>;
}
</span></span>

여기서 오류는 Hash_equals 가 아니라 오류 조건 하에서 적절한 프로세스 처리가 부족합니다. 비밀번호 검증 프로세스의 보안을 보장하려면 비밀번호가 올바른지 여부에 관계없이 피드백이 올바른지 확인해야합니다.

해결책:
Hash_equals 의 반환 값에 따라 적절한 판단을 내십시오.

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$storedPasswordHash</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-comment">// 더 안전한 오류 처리,로깅과 같은</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Invalid password!"</span></span><span>;
}
</span></span>

6. 요약

Hash_equals 는 시간 공격을 방지하는 매우 중요한 PHP 기능이지만 전능하지 않으며 잘못 사용하면 프로그램의 보안 취약점으로 이어질 수 있습니다. 일반적인 오류에는 혼란스러운 해시 비교, 일반 텍스트 암호와 해시 값, 일관되지 않은 해시 길이, 다른 해시 알고리즘을 사용한 일관되지 않은 해시 길이, 반환 값을 무시하는 것이 포함됩니다. 이러한 오류를 해결하는 핵심은 Hash_equals 의 사용 시나리오를 이해하고 적절한 시나리오에서 암호를 사용하여 암호의 정확성을 확인하는 것입니다.

올바른 구현 및 모범 사례를 통해 비밀번호 검증 프로세스의 보안을 크게 개선하고 잠재적 인 공격 위험을 피할 수 있습니다.