현재 위치: > 최신 기사 목록> 보안 사용자 인증을 위해 Hash_equals 기능을 사용하십시오

보안 사용자 인증을 위해 Hash_equals 기능을 사용하십시오

gitbox 2025-05-29

PHP에서 사용자 인증은 보안 응용 프로그램 구축의 기본 링크입니다. 비밀번호 나 토큰을 비교할 때 안전하지 않은 문자열 비교 방법은 타임 공격으로 이어질 수있어 공격자가 민감한 정보를 유추 할 수 있습니다. PHP는 이러한 공격을 방지하도록 특별히 설계된 기능 Hash_equals () 를 제공하며, 이는 보안을 보장하기 위해 일정한 시간으로 두 줄을 비교할 수 있습니다.

이 기사는 Hash_equals () 기능을 사용하여 일반적인 보안 위험을 피하기 위해 안전한 사용자 인증 프로세스를 구현하는 방법을 소개합니다.


1. 타이밍 공격이란 무엇입니까?

시간 공격은 프로그램을 측정하여 다른 입력 문자열에 필요한 시간의 차이를 측정하여 암호 해시 또는 인증 토큰과 같은 민감한 정보를 점차적으로 추측하는 공격자를 말합니다.

기존 문자열 비교 함수 (예 : == 또는 strcmp )는 일치가 실패하면 가능한 한 빨리 돌아와서 비교 시간이 문자열의 유사성에 의존하여 정보를 노출시킵니다.


2. php의 hash_equals ()

Hash_equals () 는 PHP 5.6 이상에서 제공하는 함수입니다. 수익 시간의 차이로 인해 정보 누출을 피하기 위해 일정한 시간에 두 줄을 비교하도록 설계되었습니다.

기능 프로토 타입 :

 bool hash_equals(string $known_string, string $user_string)
  • $ 알려진_string : 알려진 문자열 (보통 저장된 해시 값).

  • $ user_string : 사용자가 입력 한 문자열 (확인 해야하는 값).

두 줄이 같으면 true를 반환하십시오. 그렇지 않으면 false를 반환하십시오.


3. 보안 인증을 구현하기 위해 hash_equals ()를 사용하는 예입니다

사용자가 등록 할 때 보안 알고리즘을 사용하여 비밀번호 해시를 보유하고 저장했다고 가정합니다. 로그인 할 때는 사용자가 입력 한 암호를 확인해야합니다.

샘플 코드 :

 <?php
// 사용자 등록시,비밀번호 해시를 데이터베이스에 저장하십시오
$password = 'user_password123';
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// 사용자가 로그인하면,비밀번호를 확인하십시오
$input_password = $_POST['password'] ?? '';

// 비밀번호를 확인하십시오
if (password_verify($input_password, $hashed_password)) {
    // 데이터베이스에 저장된 해시 문자열을 꺼내십시오
    $stored_hash = $hashed_password;
    // 비교를 위해 사용자의 비밀번호를 재사용하십시오(여기의 데모 시나리오는 검증 토큰 및 기타 상황입니다.)
    $input_hash = hash('sha256', $input_password);

    // 사용 hash_equals 일정한 시간 비교
    if (hash_equals($stored_hash, $input_hash)) {
        echo "성공적인 인증";
    } else {
        echo "인증이 실패했습니다";
    }
} else {
    echo "인증이 실패했습니다";
}
?>

참고 : 위의 예에서, password_verify () 자체는 암호 해시를 안전하게 확인했으며 hash_equals ()는 API 토큰 또는 사용자 정의 해시 값을 확인하는 시나리오에 적합합니다.


4. API 토큰 검증에 대한 보안 예

많은 시나리오에서 사용자가 통과 한 API 토큰이 서버에 저장된 토큰과 일치하는지 여부를 확인해야합니다. == 직접 사용하면 시간 공격의 위험이 있습니다.

예:

 <?php
// 서버 측 스토리지API토큰
$stored_token = 'abc123def456';

// 用户提交的토큰
$provided_token = $_GET['token'] ?? '';

// 안전한 비교를하십시오
if (hash_equals($stored_token, $provided_token)) {
    echo "토큰验证通过";
} else {
    echo "토큰验证失败";
}
?>

이런 식으로, 토큰이 일치하지 않더라도, 공격자는 시간이 많이 걸리는 프로세스를 비교하여 올바른 토큰을 유추 할 수 없습니다.


5. 요약

  • Hash_equals ()는 시간 공격을 방지하는 일정한 시간 문자열 비교를 제공합니다.

  • 비밀번호 확인에서 Password_Hash ()Password_Verify ()를 사용하는 것이 좋습니다. 그리고 Hash_equals ()는 토큰 또는 해시 값의 안전한 비교에 적합합니다.

  • 합리적으로 hash_equals ()를 사용하여 인증 프로세스의 보안을 크게 개선 할 수 있고 민감한 정보 누출의 위험을 줄일 수 있습니다.


PHP 보안 인증 모범 사례에 대해 자세히 알아 보려면 https://gitbox.net/php-security를 ​​방문하십시오.