PHP에서 암호 해싱 및 확인을 수행 할 때 Crypt () 및 Password_Verify () 는 자주 언급 된 기능입니다. 모두 암호 보안 처리를 포함하지만 다르게 사용되며 다른 목적으로 설계됩니다. 따라서 개발자는 다음과 같이 묻습니다.
crypt ()는 초기에 비밀번호를 암호화하는 데 PHP에서 사용되는 기능입니다. 다음과 같은 다양한 알고리즘을 지원합니다.
DES (기본값)
MD5 ( $ 1 $ 로 시작)
Blowfish ( $ 2A $ , $ 2Y $ 등으로 시작)
SHA-256, SHA-512 ( $ 5 $ , $ 6 $ 로 시작)
일반적인 crypt () 사용은 다음과 같습니다.
$password = 'mySecret';
$salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
Password_Verify () 는 PHP 5.5에서 소개 된 함수이며 Password_Hash ()를 사용하여 생성 된 해시를 검증하기 위해 특별히 설계되었습니다. 해싱이 사용하는 알고리즘 (예 : BCrypt, Argon2)을 자동으로 식별하고 입력 된 일반 텍스트 비밀번호에 따라 비교합니다.
if (password_verify('mySecret', $hashFromDatabase)) {
echo '올바른 비밀번호';
}
짧은 대답 : 권장하지 않으며 의미가 없습니다.
password_verify ()가 실제로 crypt () 와 유사한 기본 메커니즘을 호출하고 있지만 "가정용"함수 password_hash () 에 의해 생성 된 해시 형식 만 지원합니다. crypt ()를 사용하여 해시를 사용자 정의한 다음 Appartment_Verify ()를 사용하여 확인하면 다음과 같은 문제가 발생합니다.
해시 형식이 Password_verify () 기대치를 충족하지 않으면 False를 반환합니다.
PHP는 미래 버전에서 crypt () 에 의해 생성 된 비표준 형식의 해시에 대한 지원을 보장하지 않습니다.
password_verify ()는 잘못된 형식의 해시에 대해 전혀 구문 분석되지 않을 수 있으므로 항상 확인이 실패합니다.
다시 말해, 두 사람은 관련이 있지만 상호 운용 가능한 기능 쌍은 아닙니다.
오류가 발생하기 쉬운 소금 값 및 알고리즘 선택을 수동으로 관리합니다.
부적절하게 사용하는 경우 (기본 DES 알고리즘 또는 약한 소금 값을 사용하는 것과 같은), 당신은 무차별 균열이 발생하기 쉽습니다.
자동 업데이트 알고리즘에 대한 메커니즘이 없습니다.
미래의 호환성은 보장 할 수 없습니다.
보안 기본 알고리즘 (예 : BCrypt)을 자동으로 선택합니다.
소금 값을 자동으로 생성합니다.
알고리즘은 잘 캡슐화되어 있으며 개발자는 기본 구현에 신경을 줄 필요가 없습니다.
스무딩 알고리즘은 password_needs_rehash () 를 통해 업그레이드 할 수 있습니다.
안전은 현대 표준에 의해 검토됩니다.
더 나은 보안 및 향후 호환성을 위해서는 항상 password_verify ()를 사용하여 Appartment_hash () 를 사용하는 것이 좋습니다 .
// 비밀번호를 등록하거나 수정할 때
$hash = password_hash('mySecret', PASSWORD_DEFAULT);
// 로그인시 확인하십시오
if (password_verify('mySecret', $hash)) {
// 확인이 성공적입니다
}
기존 시스템에서 crypt ()를 사용하는 경우 사용자 로그인이 성공한 후에 해시를 재생하고 데이터베이스의 값을 업데이트하는 후에 암호 _HASH ()를 사용하는 것이 좋습니다. 이 접근법은 점차 안전한 암호화 방법으로 점차 부드럽게 전환 될 수 있습니다.
Crypt () 는 PHP의 베테랑이지만 비밀번호 처리 분야에서보다 현대적이고 안전한 Password_hash () 및 Password_verify () 로 점차 대체되었습니다. crypt () 및 password_verify ()를 조합하여 사용하면 예상되는 보안 개선이 발생하지 않지만 비 호환성으로 인해 검증 실패 및 기타 문제가 발생할 수 있습니다. 따라서 모범 사례는 PHP가 제공하는 Password_Series 함수를 사용하여 사용자 비밀번호를 처리하여 시스템의 보안 및 유지 관리를 보장하는 것입니다 .
추가 보안 조치를 위해 Argon2 알고리즘을 조합하여 사용할 수 있습니다.