현재 위치: > 최신 기사 목록> crypt ()를 사용하여 암호를 hash_equals ()와 안전하게 비교하십시오.

crypt ()를 사용하여 암호를 hash_equals ()와 안전하게 비교하십시오.

M66 2025-05-20

사용자 인증 시스템을 구축 할 때는 비밀번호를 안전하게 처리하는 것이 개발자가주의를 기울여야하는 문제입니다. 비밀번호를 잘못 비교하면 시스템에 타이밍 공격과 같은 보안 위협이 발생할 수 있습니다. PHP는 비밀번호 검증을 안전하게 처리하는 데 도움이되는 몇 가지 내장 기능을 제공합니다. 그중에서도 crypt ()hash_equals () 의 조합은 비교적 안전한 연습 방식입니다.

1. crypt () 함수는 무엇입니까?

Crypt () 는 일부 알고리즘 (예 : BCrypt , SHA-512 등)을 기반으로 암호화 암호를 해시하는 데 사용되는 PHP의 암호화 기능입니다. 구문은 다음과 같습니다.

 string crypt(string $string, string $salt)

소금 매개 변수는 암호화 알고리즘과 동작을 결정합니다. 최신 응용 프로그램의 경우 Bcrypt 가 권장되며 다음 방법으로 적절한 소금을 자동으로 생성 할 수 있습니다.

 $salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt('mypassword', $salt);

2. 비밀번호 해시를 비교하기 위해 왜 == 또는 ==를 직접 사용할 수 없습니까?

많은 초보자가 암호를 확인하기 위해 다음 코드를 작성합니다.

 if (crypt($inputPassword, $storedHash) == $storedHash) {
    // 성공적으로 로그인하십시오
}

이것은 기능이 가능해 보이지만 심각한 보안 위험 - 타이밍 공격이 있습니다. 공격자는 프로그램 응답 시간의 약간의 차이를 측정하여 올바른 암호 해시를 점차 추측 할 수 있습니다.

3. 안전 실습 : Hash_equals () 사용

타이밍 공격 문제를 해결하기 위해 PHP는 5.6 이후 Hash_equals () 기능을 제공하여 두 가지 해시 값을 안전하게 비교합니다.

 bool hash_equals(string $known_string, string $user_string)

일정한 시간 알고리즘을 사용하며 문자열의 내용에 따라 미리 반환되지 않아 시차 누출을 피합니다.

4. crypt ()와 hash_equals () 결합 된 완전한 예제

 <?php
// 데이터베이스에서 암호화 된 비밀번호 해시를받는다고 가정 해
$storedHash = '$2y$10$9YzyYtVht3tcGEn.7PiF2OlRM0HDTrM7Z5D.yPi8hdm0fJeFVKH4K'; // 의존합니다 crypt() 생성 bcrypt 해시시
$inputPassword = $_POST['password'] ?? '';

// 사용 crypt() 对사용户输入的密码进行해시시,使사용存储해시시作为 salt
$inputHash = crypt($inputPassword, $storedHash);

// 使사용 hash_equals() 안전 비교
if (hash_equals($storedHash, $inputHash)) {
    echo "성공적으로 로그인하십시오!";
} else {
    echo "오류 비밀번호!";
}
?>

5. 권장 현대 관행 (보충)

Crypt () 는 여전히 사용하기에 안전하지만 PHP 공무원은 알고리즘 선택 및 보안 비교 프로세스를 캡슐화하기 때문에 Password_hash ()Password_Verify ()를 사용하여 사용하기가 더 쉽고 안전합니다. 예를 들어:

 // 创建密码해시시
$hash = password_hash('mypassword', PASSWORD_BCRYPT);

// 비밀번호를 확인하십시오
if (password_verify($inputPassword, $hash)) {
    echo "검증이 통과되었습니다";
}

그러나 일부 시나리오 (예 : 오래된 시스템 유지 또는 특별한 요구가있는 것과 같은)에서 Crypt ()Hash_equals () 의 조합은 여전히 ​​수용 가능하고 안전한 솔루션입니다.

6. 요약

  • == 또는 === 암호 해시 비교를 사용하지 마십시오.

  • crypt () 해시 암호를 사용하는 경우 소금 및 알고리즘을 올바르게 선택해야합니다 (Bcrypt가 권장됨).

  • 타이밍 공격을 방지하기 위해 안전한 비교를 위해 hash_equals ()를 사용하십시오.

  • 구체적인 이유가 없으면 저수준 캡슐화 대신 Password_Hash ()Password_Verify ()를 사용하는 것이 좋습니다.

보안은 옵션이 아니라 사용자 암호를 처리 할 때 요구 사항입니다. 올바른 접근 방식은 사용자 개인 정보를 보호 할뿐만 아니라 전체 시스템의 공격 저항을 향상시킬 수 있습니다.