현재 위치: > 최신 기사 목록> crypt () 함수로 동일한 내용을 암호화 할 때 항상 동일한 암호화 결과를 항상 반환합니까?

crypt () 함수로 동일한 내용을 암호화 할 때 항상 동일한 암호화 결과를 항상 반환합니까?

M66 2025-06-15

PHP에서 Crypt ()는 해시 암호화의 함수이며, 암호 처리 및 데이터 암호화 시나리오에서 널리 사용됩니다. 그러나 많은 개발자들은 crypt () 함수를 사용하여 동일한 컨텐츠를 암호화 할 때 다음과 같은 것을 알고 놀랐습니다.

이 기사는이 현상의 이유를 깊이 이해하게하고 crypt ()를 올바르게 안전하게 사용하는 방법을 가르쳐 줄 것입니다.

1. crypt () 함수의 기본 원칙을 이해하십시오

crypt () 의 본질은 해시 함수로, 데이터를 암호화하는 것이 아니라 비가 역적 해시 값을 생성하는 데 종종 비밀번호 검증에 사용됩니다.

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

 string crypt(string $string, string $salt)

두 가지 매개 변수를받습니다.

  • $ String : 암호화 할 문자열.

  • $ 소금 : 암호화 중에 사용되는 "소금 값"은 해싱 결과에 영향을 미치는 데 사용됩니다.

동일한 $ 소금을 전달하면 동일한 $ String을 암호화하면 자연스럽게 동일한 결과가 나타납니다. 이것이 바로 "암호화 결과가 항상 동일하다"는 이유입니다.

2. 결과가 항상 동일한 이유는 무엇입니까?

Crypt ()를 호출 할 때 고정 소금 값을 사용했거나 단순히 두 번째 매개 변수 $ 소금을 통과했을 수 있기 때문입니다.

PHP의 Crypt ()는 $ 소금이 제공되지 않을 때 일부 시스템 기본 메커니즘을 사용하려고 시도하지만,이 메커니즘은 일부 시스템에서 "기본적으로 동일한 소금 사용"으로 나타날 수 있으므로 "동일한 입력은 항상 동일한 출력을 얻습니다".

다음 예를 살펴보십시오.

 echo crypt("mypassword", "m6"); // 고정 된 사용 salt

이 코드를 실행할 때마다 출력은 몇 번이나 상관없이 동일합니다. 이것은 공격자가 고정 소금을 사용하고 있음을 알고 있다면 해시 테이블을 미리 계산하여 시스템을 공격 할 수도 있음을 의미합니다.

3. 매번 결과를 다르게 만드는 방법은 무엇입니까?

** 올바른 방법은 : 임의의 소금 값을 사용하십시오. ** 사용자를 위해 암호 해시가 생성 될 때마다 별도의 소금이 생성되어 데이터베이스에 저장됩니다. 이런 식으로 두 사용자의 암호가 동일하더라도 해시 값이 다릅니다.

PHP는 PHP 5.5+에서 도입 된보다 안전한 방법 인 Password_hash () 함수 사용과 같은 자동 소금 생성 방법을 사용하는 것이 좋습니다.

 $password = 'mypassword';
$hash = password_hash($password, PASSWORD_BCRYPT);

이 기능은 자동으로 고유 한 소금을 생성하여 결과에 부착합니다. 각 실행은 다른 결과를 얻습니다.

 // 각 출력은 다릅니다
$hash1 = password_hash('mypassword', PASSWORD_BCRYPT);
$hash2 = password_hash('mypassword', PASSWORD_BCRYPT);

그러나 여전히 Password_Verify () 를 통해 원래 비밀번호를 확인하는 데 사용될 수 있습니다.

4. crypt ()를 사용하지 않으면 어떻게해야합니까?

crypt ()를 사용해야하는 경우 수동으로 임의의 소금을 생성하십시오. 예는 다음과 같습니다.

 function generate_salt($length = 22) {
    return substr(strtr(base64_encode(random_bytes($length)), '+', '.'), 0, $length);
}

$password = 'mypassword';
$salt = '$2y$10$' . generate_salt(); // 사용 Blowfish 연산
$hash = crypt($password, $salt);

각 통화는 다른 소금을 생성하며 자연스럽게 다른 암호화 결과가 생성됩니다.

5. 저장 및 검증

암호화 된 결과는 후속 확인을 위해 데이터베이스에 저장해야합니다. 샘플 코드는 다음과 같습니다.

 // 저장할 때
$hash = crypt($password, $salt);
// 데이터베이스에 저장하십시오

// 검증 중
if (hash_equals($hash, crypt($inputPassword, $hash))) {
    echo "올바른 비밀번호";
} else {
    echo "오류 비밀번호";
}

Crypt () 의 두 번째 매개 변수는 암호화 된 해시 값으로 직접 전달할 수 있으며 PHP는 자동으로 염을 추출합니다.

6. 요약

  • crypt ()는 같은 소금을 사용했기 때문에 동일한 결과를 반환합니다.

  • 안전하려면 임의의 소금을 사용하거나 Password_hash ()를 직접 사용해야합니다.

  • 특별한 요구 사항이없는 한 새 프로젝트에서 crypt ()를 계속 사용하는 것이 좋습니다.

  • 무지개 테이블 공격을 방지하기 위해 항상 하드 코딩 된 소금을 피하십시오.

사용자 암호 처리와 관련된 시스템을 개발할 때는 보안이 항상 최우선 과제입니다. crypt () 의 동작에 대한 올바른 이해는보다 안정적이고 안정적인 애플리케이션 시스템을 구축하는 데 도움이됩니다.