PHP에서 Hash_equals ()는 두 문자열이 동등한 지, 특히 해시 값을 다룰 때 일반적인 보안 취약점을 피할 수있는 경우에도 안전하게 비교하는 데 사용되는 함수입니다. 그러나 특히 주석의 규칙이 있습니다. hash_equals ()는 비교에 사용 된 두 해시 값이 정확히 같은 길이 여야합니다. 그렇다면 왜이 규칙이 존재합니까? 그 뒤에있는 보안 이유는 무엇입니까?
Hash_equals ()는 시간 공격 (타이밍 공격)에 저항하도록 설계되었습니다. Time Attack은 다른 입력을 처리 할 때 프로그램에 소요되는 시간 차이를 관찰하여 입력 컨텐츠를 지정하는 공격 방법입니다. 이론적으로, 우리가 두 개의 해시 값을 비트 단위로 비교하면 비교하면 비교 작업이 조기에 종료되고 다른 결과를 반환합니다. 즉, 해시 값이 길어지면 계산 프로세스 중에 시간이 더 걸리므로 공격자에게 잠재적 인 신호를 제공합니다. 공격자는 시간을 분석하고 비교하여 해시 값의 내용을 점차적으로 추론 할 수 있습니다.
이 공격을 방지하기 위해 Hash_equals ()는 구현 될 때 일정한 시간 비교 전략을 사용합니다. 즉, 두 해시 값의 첫 번째 문자가 이미 다른 경우에도 항상 모든 문자를 확인합니다. 따라서 해시 값이 동일한 지 여부에 관계없이 전체 비교 프로세스의 실행 시간이 고정됩니다. 이 일정한 시간 비교는 두 해시 값의 길이가 같은 경우에만 신뢰할 수 있습니다. 두 해시의 길이가 다른 경우 비교 프로세스가 일찍 종료되어 공격자에게 사용 가능한 시차를 남기고 민감한 정보를 노출시킬 수 있습니다.
해싱 알고리즘의 목적은 모든 길이의 데이터를 고정 길이 스트링에 매핑하는 것입니다. 비교 중 해시 값의 길이가 일치하지 않으면 입력 데이터가 다른 또는 해시 알고리즘의 일관성이없는 구현이 있음을 의미합니다. 해시 값을 동일한 길이로 요구함으로써 Hash_equals ()는 동일한 유형의 데이터를 비교하여 비교를 피할 수 있습니다.
예를 들어, 응용 프로그램이 사용자 비밀번호에 대한 해시 값을 저장한다고 가정하십시오. 암호를 확인할 때 들어오는 해시 길이가 저장된 해시 길이와 일치하지 않으면 두 해시 값이 다른 소스에서 나온 것으로 가정하는 것이 안전합니다. 해시 값의 길이를 확인함으로써 Hash_equals ()는 검증 프로세스 중에 불필요한 오류를 피할 수 있습니다.
해시 충돌은 두 개의 다른 입력 값이 동일한 해시 값을 생성 할 때입니다. 현대 해싱 알고리즘 (SHA-256과 같은)은 충돌 확률을 최소화하도록 설계되었지만 완전히 피할 수는 없습니다. 보안 취약성을 더욱 줄이기 위해 Hash_equals ()는 해시 값의 길이가 일관성이 있어야하므로 비교 프로세스 중에 다른 길이의 동일한 해시 값을 잘못 판단하여 발생하는 잠재적 보안 위험이 발생하지 않습니다.
두 해시 값이 길이가 같지 않으면 공격자는 입력 값을 구성하고 해시 알고리즘의 충돌 취약성을 사용하여 공격 할 수 있습니다. 따라서 Hash_equals ()는 해시 길이가 동일 한 경우에만 해시 값의 보안을 효과적으로 보장 할 수 있습니다.
개발자의 경우 보안 문자열 비교 함수를 수동으로 구현할 때 버퍼 오버플로, 시간 공격 등과 같은 많은 보안 취약점을 고려해야합니다. Hash_equals ()는 PHP에서 안전하고 효율적인 해시 비교 방법을 제공합니다. 개발자는 안전한 비교가 올바르게 구현되는지 걱정하지 않고 해시 가치 자체에만주의를 기울여야합니다. 해시 가치가 일관되며 개발자가해야 할 판단과 보호를 더욱 줄이며 코드의 보안 및 유지 관리 가능성을 향상시킵니다.
Hash_equals () 는 해시 길이의 비교 길이가 동일해야합니다. 이 규칙은 주로 시간 공격 방지, 해시 무결성 보장, 해시 충돌 방지 및 개발자의 보안 결정을 단순화하는 등 여러 고려 사항을 기반으로합니다. 이 설계를 통해 PHP는 효율적이고 안전한 해시 비교 방법을 제공하여 개발자가 일반적인 보안 공격으로부터 응용 프로그램을 보호 할 수 있도록 도와줍니다.