PHP에서 해시 함수는 암호 검증 및 데이터 무결성 확인과 같은 시나리오에서 널리 사용됩니다. 데이터 보안을 보장하기 위해서는 종종 두 해시 값이 일관되는지 여부를 결정해야합니다. PHP는 해시 값을 생성하고 비교하기위한 여러 기능을 제공합니다. Hash_copy 및 Hash_equals 는 일반적으로 사용되는 두 가지 기능으로 해시 값 비교 작업을 효과적으로 완료하는 데 도움이됩니다.
HASH_COPY
Hash_copy 함수는 실제로 PHP에 존재하지 않습니다. 일부 문서 나 기사에서도 비슷한 진술이 보일 수 있으며, 이는 오용하거나 오해 할 수 있습니다. PHP의 해시 비교 및 복사에 대한 일반적인 기능은 hash () 및 hash_equals () 입니다.
Hash_equals
Hash_equals 는 PHP가 제공하는 기능으로 두 개의 해시 값을 안전하게 비교합니다. 그 기능은 시간 차이 공격을 방지하는 것입니다. 기존의 문자열 비교를 통해 공격자는 비교 작업의 시차를 비교하여 해시 값의 차이를 유추 할 수 있습니다. Hash_equals는 두 해시 값의 길이가 동일 할 때 이러한 시간 차이가 노출되지 않도록 할 때 문자 별 비교를 수행합니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$known_string</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$user_string</span></span><span> )
</span></span>
$ 알려진_string : 알려진 해시 값 또는 문자열.
$ user_string : 사용자가 입력 한 해시 값 또는 문자열.
반환 값 : 두 문자열이 정확히 동일하면 true 반환 true가 그렇지 않으면 false를 반환하십시오.
두 해시 값이 일관성이 있는지 여부를 비교하려면 Hash_equals 기능을 사용하여 안전하고 정확한 판단을 보장 할 수 있습니다. 다음은 일반적인 예입니다. 사용자가 입력 한 비밀번호가 데이터베이스에 저장된 해시 값과 일치하는지 확인해야합니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 해시 값이 데이터베이스에 저장되었다고 가정합니다</span></span><span>
</span><span><span class="hljs-variable">$stored_hash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$V5ldlhO.Jk19pZpWzchL7vJdknz57Vry8V15hATFmgt0gt04SKeQK'</span></span><span>; </span><span><span class="hljs-comment">// 해시 비밀번호</span></span><span>
</span><span><span class="hljs-comment">// 사용자가 입력 한 비밀번호</span></span><span>
</span><span><span class="hljs-variable">$user_input_password</span></span><span> = </span><span><span class="hljs-string">'user_password'</span></span><span>;
</span><span><span class="hljs-comment">// 사용 password_hash 해시를 생성하고 확인하십시오</span></span><span>
</span><span><span class="hljs-variable">$input_hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, PASSWORD_DEFAULT);
</span><span><span class="hljs-comment">// 사용 hash_equals 두 가지 해시 값 비교</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">$stored_hash</span></span><span>, </span><span><span class="hljs-variable">$input_hash</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"일관된 비밀번호!"</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">"암호는 일관성이 없습니다!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
이 예에서는 Password_hash가 사용자의 비밀번호를 해시했지만 Hash_equals 의 역할은 비교 중 길이가 다르기 때문에 잠재적 인 보안 위험이 없도록하는 것입니다.
PHP의 문자열 비교 작업 ( == 또는 strcmp () )는 실행 시간이 문자열의 길이와 내용에 따라 다르기 때문에 특정 보안 위험이 있습니다. 해시 값과 같은 민감한 데이터의 경우 ==를 사용하여 직접 비교하면 공격자는 문자열 비교의 실행 시간을 분석하여 해시 값의 차이를 유추 할 수 있습니다. 이 공격 방법을 시차 공격 이라고합니다.
Hash_equals는 이러한 공격을 피하도록 설계되었습니다. 그것은 두 줄의 길이가 일관성을 유지하고 바이트 바이트에 의해 비교되어 시간 차이로 인한 안전 위험을 제거합니다.
사용자 인증 <br> 사용자가 로그인하면 일반적으로 사용자가 입력 한 암호를 해시 한 다음 데이터베이스에 저장된 해시 값과 비교합니다. 검증 프로세스가 안전한 지 확인하려면 해시를 사용해야합니다.
데이터 무결성 검증 <br> 데이터를 전송할 때 데이터의 해시 값을 계산하여 수신기로 전송할 수 있습니다. 수신기는 HASH_Equals를 사용하여 수신 된 해시 값을 로컬 계산 된 해시 값과 비교하여 데이터가 변조되었는지 여부를 결정할 수 있습니다.
파일 해시를 생성하고 비교하십시오 파일 내용을 해시하면 파일이 변경되었는지 여부를 결정할 수 있습니다. Hash_equals는 파일 해시 값을 비교할 때 외부 공격을 피합니다.
Hash_equals 는 PHP에서 매우 안전하고 효율적인 해시 비교 기능으로, 시차 공격을 효과적으로 방지 할 수 있습니다. Hash_copy는 내장 PHP 기능이 아니지만 Hash () 및 Hash_equals 와 같은 함수를 통해 해시 값을 안전하게 처리하고 비교할 수 있습니다. 민감한 데이터를 검증 해야하는 경우, 비교 프로세스의 보안을 보장하고 잠재적 인 보안 위험을 피하기 위해 항상 hash_equals를 사용해야합니다.