현재 위치: > 최신 기사 목록> 무지개 테이블 공격을 방지하기 위해 PHP의 crypt () 함수를 올바르게 사용하는 방법은 무엇입니까?

무지개 테이블 공격을 방지하기 위해 PHP의 crypt () 함수를 올바르게 사용하는 방법은 무엇입니까?

M66 2025-07-10

최신 웹 개발에서는 사용자 비밀번호를 안전하게 저장하는 것이 중요한 작업입니다. Rainbow Table Attack은 사전 컴퓨팅 해시 테이블에 의존하여 원래 비밀번호를 빠르게 일치시키는 일반적인 비밀번호 크래킹 기술입니다. 이 공격을 효과적으로 방어하려면 암호 해시에 "소금"을 추가해야합니다. PHP의 crypt () 함수는이 도전을 잘 처리 할 수있는 도구이지만 올바르게 사용되는 경우에만 도구입니다.

1. crypt () 함수 소개

PHP의 crypt () 함수는 일방 통행점에서 문자열을 암호화하는 데 사용되며 종종 암호 해싱에 사용됩니다. 전통적인 DES, MD5 및보다 안전한 Blowfish ( $ 2Y $ ) 및 SHA-256 / 512 ( $ 5 $ / $ 6 $ )를 포함한 다양한 암호화 알고리즘을 지원합니다.

기능 프로토 타입은 다음과 같습니다.

 string crypt(string $string, string $salt);

$ string이 암호화 할 원래 문자열 인 경우 $ salt는 사용할 알고리즘과 암호화 변형을 결정합니다.

2. 왜 crypt ()가 무지개 테이블 공격을 방지 할 수 있습니까?

레인보우 테이블 공격은 해시 값의 사전 계산에 의존합니다. 그러나 각 해시의 소금 값이 다르면 공격자는 일반 무지개 테이블을 사용하여 일치시킬 수 없습니다. crypt ()를 통해 소금 값을 사용자 정의 할 수 있으며 강력한 암호화 알고리즘과 결합 하여이 공격을 효과적으로 피할 수 있습니다.

예를 들어, Blowfish 알고리즘과 동적 소금 값을 사용할 수 있습니다.

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

위 코드에서 :

  • $ 2y $ 10 $ $는 비용 계수가 10 인 Blowfish 알고리즘을 사용하는 것을 의미합니다.

  • Random_bytes (16)는 고강도 랜덤 염을 생성합니다.

  • Substr (..., 0, 22)는 Blowfish 소금 형식을 준수하는 길이로 절단됩니다.

이러한 방식으로 생성 된 $ 해시는 소금을 추가 한 후 암호 해시입니다.

3. 암호를 확인할 때 crypt ()를 사용하는 방법

사용자가 로그인하면 소금을 다시 수동으로 생성 할 필요는 없지만 데이터베이스에 저장된 해시를 소금 매개 변수로 Crypt () 로 직접 전달하십시오.

 $inputPassword = 'user-input';
$storedHash = '$2y$10$qzWRzYy5q3DvYbEC0KMX4O0PGWlOQxkz7v0QF5OwMqpyG0TzjSAGK'; // 데이터베이스에서

if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
    echo '올바른 비밀번호';
} else {
    echo '오류 비밀번호';
}

이러한 방식으로 Crypt ()는 해시의 소금 및 알고리즘을 사용하여 비밀번호를 자동으로 다시 밀어 넣은 다음 비교합니다. 이 방법은 간단하고 안전합니다.

4. 권장되는 관행과 함정

고정 된 소금 값을 사용하십시오

 $hash = crypt($password, 'fixedsalt');

이 방법은 동일한 암호가 항상 동일한 해시에 해당하기 때문에 레인보우 테이블 공격에 매우 취약합니다.

오래된 알고리즘 (예 : DE) 사용

 $hash = crypt($password, 'ab'); // DES 연산,너무 짧은 소금

DES는 소금이 짧을뿐만 아니라 계산 비용이 낮으며 최신 하드웨어는 쉽게 균열이 균열 할 수 있습니다.

5. 추가 제안

Crypt ()는 안전하지만 PHP는 5.5부터 시작하는보다 현대적인 암호 해싱 API 인 Password_hash ()Password_Verify ()를 사용하는 것이 좋습니다. 그러나 이전 프로젝트를 유지하거나 호환성 이유로 Crypt ()를 사용하는 경우 다음을 수행해야합니다.

  • 강력한 알고리즘 (예 : $ 2y $ , $ 5 $ , $ 6 $ )을 사용하십시오.

  • 항상 무작위와 긴 소금 값을 사용하십시오.

  • 소금을 재사용하지 마십시오.

  • 소금 값은 별도로 저장되지 않고 해시에 저장해야합니다.

6. 예 : 등록 및 로그인 프로세스를 완료합니다

 // 등록시
$password = $_POST['password'];
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
// 저장 $hash 데이터베이스로 이동하십시오

// 로그인 할 때
$inputPassword = $_POST['password'];
$storedHash = getHashFromDatabase(); // 데이터베이스에서 얻으십시오

if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
    echo '성공적으로 로그인하십시오';
} else {
    echo '오류 비밀번호';
}

https://m66.net/php-crypt-guide에 액세스하여 더 많은 예를 들어이 튜토리얼의 온라인 버전을 얻을 수 있습니다.

결론

Crypt () 기능을 올바르게 사용하면 무지개 테이블 공격을 효과적으로 방지 할 수 있습니다. 핵심은 비교할 때 강력한 암호화 알고리즘, 임의의 소금 값 및 보안 관행을 사용하는 것입니다. 새로운 프로젝트는 Password_hash () 일련의 함수를 사용하는 것이 좋습니다. Crypt () 의 안전한 사용을 마스터하는 것은 모든 PHP 개발자에게 강제 과정입니다.