PHP의 Crypt () 함수는 문자열 암호화 (일반적으로 암호)를위한 핵심 함수입니다. 시스템의 기본 암호화 알고리즘을 기반으로하고 입력 문자열을 해시하여 비밀번호의 보안 저장 및 검증을 달성합니다. Crypt () 함수의 기본 사용법과 목적은 PHP 버전에서 일관되지만 내부 구현 및 PHP 및 운영 체제 버전이 변경됨에 따라 지원되는 알고리즘에는 몇 가지 중요한 차이가 있습니다. 이러한 차이는 비밀번호 보안 및 응용 프로그램 호환성에 직접적인 영향을 미치며 안전하고 안정적인 응용 프로그램을 개발하는 데 필수적입니다.
crypt ()는 두 매개 변수를 수락합니다.
$hashed_password = crypt($password, $salt);
$ 비밀번호 는 일반 텍스트 비밀번호 또는 모든 문자열입니다.
$ 소금은 암호화 알고리즘의 소금 값을 제어하는 데 사용됩니다. 다른 형식은 암호화 알고리즘의 선택을 결정합니다.
리턴 값은 암호화 된 문자열입니다. 비밀번호를 확인할 때 동일한 소금을 사용하여 암호를 다시 암호화하여 결과가 일관되는지 여부를 비교합니다.
초기 PHP 버전 (PHP 4.X, PHP 5.2 및 이전)
시스템에서 제공하는 표준 DES 암호화 만 (56 비트 키를 기반으로, 소금은 2 자)이며 보안이 낮습니다.
제공된 소금 형식이 잘못된 경우 Crypt ()는 DES 암호화를 사용하여 퇴보합니다.
PHP 5.3 이상
MD5와 같은보다 현대적인 암호화 알고리즘 (Salt Format은 $ 1 $ 로 시작)을 지원하기 시작합니다.
Blowfish도 지원됩니다 (Salt Format은 PHP 버전에 따라 $ 2A $ 또는 $ 2Y $ 로 시작합니다),
SHA-256 ( $ 5 $ ) 및 SHA-512 ( $ 6 $ )와 같은 알고리즘이 운영 체제의 LIBC 라이브러리가 지원하는 것이 제공됩니다.
php 7.x
Blowfish 지원을 계속 개선하고 역사상 일부 보안 취약점 (예 : $ 2A $ )을 수정하십시오.
PHP 7.3은 나중에 더 안전한 Blowfish 버전 인 $ 2y $ 태그를 소개했습니다.
다른 시스템에 대한 지원이 높고 더 많은 알고리즘이 지원됩니다.
php 8.x
위의 알고리즘에 대한 지원을 유지하고 보안 및 호환성에주의하십시오.
PHP의 기본 비밀번호 해시 함수 암호 _hash () 및 password_verify () 를 사용하는 것이 좋습니다. 그러나 crypt ()는 여전히 사용 가능합니다.
crypt () 함수는 실제로 운영 체제의 LIBC 라이브러리 (예 : GNU LIBC, BSD LIBC)에 의존하여 암호화 작업을 완료합니다.
지원되는 알고리즘은 다른 운영 체제 (Linux, FreeBSD, Windows)에서 동일한 PHP 버전에 대해 완전히 일관되지 않을 수 있습니다.
Windows의 Crypt () 지원은 매우 제한적이며 일반적으로 기존 DES 암호화 만 지원합니다.
Linux는 일반적으로 LIBC 버전에 따라 여러 알고리즘을 지원합니다.
다른 암호화 알고리즘 사이에는 보안에 큰 차이가 있습니다. 초기 DES 암호화 알고리즘은 쉽게 갈라졌으며 더 이상 생산 환경에서 사용해서는 안됩니다. 최신 알고리즘 (예 : Blowfish, SHA-512)을 지원하는 PHP 버전 및 운영 체제는 비밀번호 스토리지의 보안을 크게 향상시킬 수 있습니다.
응용 프로그램이 crypt () 에 의존하고 Salt 형식을 명시 적으로 지정하지 않으면 PHP 버전을 업그레이드하거나 운영 체제를 마이그레이션 할 때 암호 확인 실패가 발생할 수 있습니다.
예를 들어, 이전 시스템은 DES로만 암호화되어 마이그레이션 후 SHA-512가되어 새 시스템이 이전 비밀번호를 올바르게 확인할 수 없습니다.
따라서 응용 프로그램에서 Salt 형식을 명시 적으로 지정하거나보다 현대적인 암호 처리 인터페이스를 채택하는 것이 좋습니다.
PHP 공무원은 Password_hash () 및 Password_verify ()를 버전 5.5에 도입하여 암호 암호화 및 확인의 세부 사항을 캡슐화했습니다.
$hash = password_hash($password, PASSWORD_DEFAULT); // 기본적으로 사용됩니다 bcrypt
if (password_verify($password, $hash)) {
echo "비밀번호 확인이 성공했습니다";
}
이 인터페이스에는 호환성이 우수하고 보안이 높으며 가장 안전한 알고리즘을 자동으로 선택할 수 있습니다.
crypt ()를 직접 사용하는 복잡성과 호환성 문제를 피하십시오.
향후 버전에서는 Crypt ()을 직접 호출하는 대신이 솔루션을 권장합니다.
다음 예제는 소금이 다른 crypt ()를 호출하는 방법을 보여주고 암호화 결과의 차이점을 보여줍니다.