PHP에서 crypt () 함수는 일방 통행 해싱에서 문자열을 암호화하는 데 사용되며, 종종 비밀번호를 저장하고 확인하는 데 사용됩니다. 사용량은 다른 플랫폼에서 거의 동일하지만 Crypt () 가 반환 한 결과는 종종 운영 체제, 특히 Windows 및 Linux마다 다릅니다. 이 차이는 많은 개발자들을 혼란스럽게합니다. 이 기사는 심층적 인 이유를 분석하고 해결책을 제공합니다.
crypt () 는 인터페이스 함수이며 기본 구현은 운영 체제가 제공하는 암호화 알고리즘에 따라 다릅니다. 일반적으로 DES, MD5, SHA-256, SHA-512 등 다양한 암호화 알고리즘을 지원합니다. 특정 지원은 운영 체제 및 PHP 버전에 따라 다릅니다.
호출 형식 예제 :
$hash = crypt('mypassword', '$6$rounds=5000$usesomesillystringforsalt$');
여기서 두 번째 매개 변수는 암호화 알고리즘과 암호화 강도를 결정하는 소금입니다.
Linux는 일반적으로 GLIBC (GNU C 라이브러리)를 기반으로 Crypt () 구현을 사용하여 다양한 현대적인 해싱 알고리즘 (SHA-256, SHA-512 등)을 지원합니다.
Windows에는 내장 Crypt () 구현이 없습니다. PHP는 Windows에서 비교적 기본 구현을 사용합니다. Windows는 일반적으로 기존 DES 또는 MD5 알고리즘 만 지원하며 비교적 제한된 암호화 방법을 갖습니다.
이로 인해 Linux에서 SHA-512 소금 매개 변수를 사용할 때 해당 해시가 올바르게 생성되는 반면 Windows는이 소금 형식을 인식하지 못할 수 있으며 반환 결과는 다릅니다.
다른 PHP 버전은 crypt () 의 지원을 최적화하고 보충 할 수 있지만 기본 레이어는 여전히 시스템 라이브러리에 따라 다릅니다. Windows의 PHP는 일반적으로 내부 구현에만 의존 할 수 있으므로 성능은 Linux만큼 포괄적이지 않습니다.
Linux는 다음과 같은 풍부한 소금 형식을 지원합니다.
$ 1 $는 MD5를 의미합니다
$ 5 $는 SHA-256을 의미합니다
$ 6 $는 SHA-512를 의미합니다
Windows는 $ 1 $ 와 같은 간단한 형식 만 인식 할 수 있으며 복잡한 형식은 무시되어 해시 결과가 다릅니다.
PHP 5.5는 나중에보다 현대적이고 통합 된 비밀번호 해시 인터페이스를 도입했습니다.
$hash = password_hash('mypassword', PASSWORD_DEFAULT);
if (password_verify('mypassword', $hash)) {
echo "비밀번호 확인이 성공했습니다";
}
내부적으로 교차 플랫폼 호환 구현을 캡슐화하여 다른 시스템에서 crypt () 의 일관되지 않은 동작 문제를 피합니다.
표준 인터페이스를 사용하여 수동 접합 대신 소금을 생성하십시오. 소금을 수동으로 설정하면 호환성과 안전 위험이 발생할 수 있습니다.
Crypt ()를 사용해야하는 경우 해싱 알고리즘 차이로 인해 검증 실패를 피하기 위해 대상 시스템에서 테스트를 수행하십시오.
<?php
// 권장 사용 password_hash 대안 crypt
$password = 'mypassword';
$hash = password_hash($password, PASSWORD_DEFAULT);
echo "해시 결과:" . $hash . PHP_EOL;
// 비밀번호를 확인하십시오
if (password_verify($password, $hash)) {
echo "비밀번호 확인이 성공했습니다";
} else {
echo "비밀번호 확인이 실패했습니다";
}
?>
이 방법은 Windows 및 Linux 환경에서 일관된 성능을 보장하고 안전한 해싱 알고리즘을 사용합니다.