PHP에서 Crypt ()는 해시 암호화의 함수이며, 암호 처리 및 데이터 암호화 시나리오에서 널리 사용됩니다. 그러나 많은 개발자들은 crypt () 함수를 사용하여 동일한 컨텐츠를 암호화 할 때 다음과 같은 것을 알고 놀랐습니다.
이 기사는이 현상의 이유를 깊이 이해하게하고 crypt ()를 올바르게 안전하게 사용하는 방법을 가르쳐 줄 것입니다.
crypt () 의 본질은 해시 함수로, 데이터를 암호화하는 것이 아니라 비가 역적 해시 값을 생성하는 데 종종 비밀번호 검증에 사용됩니다.
기능 프로토 타입은 다음과 같습니다.
string crypt(string $string, string $salt)
두 가지 매개 변수를받습니다.
$ String : 암호화 할 문자열.
$ 소금 : 암호화 중에 사용되는 "소금 값"은 해싱 결과에 영향을 미치는 데 사용됩니다.
동일한 $ 소금을 전달하면 동일한 $ String을 암호화하면 자연스럽게 동일한 결과가 나타납니다. 이것이 바로 "암호화 결과가 항상 동일하다"는 이유입니다.
Crypt ()를 호출 할 때 고정 소금 값을 사용했거나 단순히 두 번째 매개 변수 $ 소금을 통과했을 수 있기 때문입니다.
PHP의 Crypt ()는 $ 소금이 제공되지 않을 때 일부 시스템 기본 메커니즘을 사용하려고 시도하지만,이 메커니즘은 일부 시스템에서 "기본적으로 동일한 소금 사용"으로 나타날 수 있으므로 "동일한 입력은 항상 동일한 출력을 얻습니다".
다음 예를 살펴보십시오.
echo crypt("mypassword", "m6"); // 고정 된 사용 salt
이 코드를 실행할 때마다 출력은 몇 번이나 상관없이 동일합니다. 이것은 공격자가 고정 소금을 사용하고 있음을 알고 있다면 해시 테이블을 미리 계산하여 시스템을 공격 할 수도 있음을 의미합니다.
** 올바른 방법은 : 임의의 소금 값을 사용하십시오. ** 사용자를 위해 암호 해시가 생성 될 때마다 별도의 소금이 생성되어 데이터베이스에 저장됩니다. 이런 식으로 두 사용자의 암호가 동일하더라도 해시 값이 다릅니다.
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 () 를 통해 원래 비밀번호를 확인하는 데 사용될 수 있습니다.
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);
각 통화는 다른 소금을 생성하며 자연스럽게 다른 암호화 결과가 생성됩니다.
암호화 된 결과는 후속 확인을 위해 데이터베이스에 저장해야합니다. 샘플 코드는 다음과 같습니다.
// 저장할 때
$hash = crypt($password, $salt);
// 데이터베이스에 저장하십시오
// 검증 중
if (hash_equals($hash, crypt($inputPassword, $hash))) {
echo "올바른 비밀번호";
} else {
echo "오류 비밀번호";
}
Crypt () 의 두 번째 매개 변수는 암호화 된 해시 값으로 직접 전달할 수 있으며 PHP는 자동으로 염을 추출합니다.
crypt ()는 같은 소금을 사용했기 때문에 동일한 결과를 반환합니다.
안전하려면 임의의 소금을 사용하거나 Password_hash ()를 직접 사용해야합니다.
특별한 요구 사항이없는 한 새 프로젝트에서 crypt ()를 계속 사용하는 것이 좋습니다.
무지개 테이블 공격을 방지하기 위해 항상 하드 코딩 된 소금을 피하십시오.
사용자 암호 처리와 관련된 시스템을 개발할 때는 보안이 항상 최우선 과제입니다. crypt () 의 동작에 대한 올바른 이해는보다 안정적이고 안정적인 애플리케이션 시스템을 구축하는 데 도움이됩니다.