PHP에서 Crypt () 함수는 암호를 암호화하는 전통적인 방법입니다. 여러 암호화 알고리즘을 지원하고 다른 형식의 소금 값을 전달하여 특정 암호화 메커니즘을 가능하게합니다. 최근 몇 년 동안 더 현대적인 암호 해싱 API (예 : Password_hash () )가 권장되었지만 Crypt () 는 여전히 일부 기존 시스템에서 널리 사용됩니다. 따라서 Crypt () 함수에 대한 적절한 알고리즘 및 소금 값 형식을 선택하는 방법을 이해하는 것이 보안 및 시스템 호환성을 보장하는 핵심입니다.
crypt () 함수는 소금 값 접두사를 식별하는 데 사용되는 알고리즘을 사용합니다. 다음은 주류 알고리즘과 해당 소금 가치 형식입니다.
DES (전통적인 알고리즘)
소금 가치 형식 : 2 자 (예 : "XY")
안전 : 매우 낮고 더 이상 권장되지 않습니다.
MD5
소금 가치 형식 : $ 1 $ + 최대 8 자까지 (예 : $ 1 $ ABC12345 )
보안 : 약하고 무차별대로 쉽게.
블로우 피쉬
소금 가치 형식 : $ 2Y $ + 2 비트 비용 계수 + 22 비트 Base64 인코딩 (예 : $ 2Y $ 10 $ ABCDEFGHIJKLMNOPQRSTUU )
안전 : 높고 널리 사용됩니다.
호환성 : $ 2Y $는 과거 보안 문제를 해결하기 때문에 $ 2A $ 대신 $ 2Y $ 를 사용하는 것이 좋습니다.
SHA-256 및 SHA-512 (GLIBC)
소금 가치 형식 :
SHA-256 : $ 5 $ + 선택적 라운드 매개 변수 + 소금 (예 : $ 5 $ Rounds = 5000 $ mySaltValue )
SHA-512 : $ 6 $ + 선택적 라운드 매개 변수 + SALT (예 : $ 6 $ mySaltValue )
안전 : 높은
호환성 : GLIBC (대부분의 Linux 시스템)가 지원하는 플랫폼에서 사용 가능하지만 Windows는 아닙니다.
암호화 알고리즘을 선택할 때 다음 사항을 고려해야합니다.
보안 요구 사항 : 시스템이 최신 하드웨어에서 무차별 인력 균열에 저항 해야하는 경우 Blowfish ( $ 2Y $ ) 또는 SHA-512 ( $ 6 $ )를 사용하는 것이 좋습니다.
크로스 플랫폼 호환성 : Linux와 Windows 사이에 시스템을 마이그레이션 해야하는 경우 SHA 변형이 Windows에서 호환되지 않기 때문에 Blowfish 알고리즘을 먼저 사용해야합니다.
계산 비용 관리 : Blowfish는 비용 매개 변수 (2–31)를 지원하며 서버 성능에 따라 조정할 수 있습니다. 예를 들어 $ 2Y $ 12 $는 2^12 반복을 의미합니다.
소금 값은 동일한 암호가 동일한 해시를 생성하는 것을 방지하는 데 사용되므로 다음 특성은 다음과 같습니다.
고유성 : 각 사용자의 암호는 다른 소금을 사용해야합니다.
예측 불가능 성 : 안전한 의사 랜덤 소스를 사용하여 소금을 생성해야합니다.
소금으로 해시를 생성하기 위해 Blowfish를 사용하여 샘플 코드 :
function generateSalt($cost = 10) {
$salt = substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s$', $cost, $salt);
}
$password = 'MySecurePassword123';
$salt = generateSalt(12);
$hash = crypt($password, $salt);
echo "암호화 된 암호는입니다: " . $hash;
암호 확인에 Crypt ()를 사용하는 경우 사용자 입력을 원래 해시와 함께 Crypt () 로 전달해야합니다.
function verifyPassword($password, $hash) {
return crypt($password, $hash) === $hash;
}
이렇게하면 검증 프로세스가 동일한 알고리즘과 소금 값을 사용하도록합니다.
알 수없는 소금 값으로 문자열을 수동으로 지정하지 말고 프로그램에서 자동으로 생성 된 안전한 소금 값을 사용하십시오.
여전히 지원되는 경우에도 DES 또는 MD5를 사용하지 마십시오 .
비밀번호 _hash () 및 password_verify () 로 우선적으로 마이그레이션하면 이러한 기능은 PHP에 의해 유지되며 알고리즘과 소금 값을 자동으로 처리하여 현대의 공격에 더 잘 저항 할 수 있습니다.
기존 시스템은 사용자가 등록 할 때 비밀번호를 저장합니다.
$password = $_POST['password'];
$salt = generateSalt(12);
$hashed = crypt($password, $salt);
// 유지하다 $hashed 데이터베이스로 이동하십시오
로그인 할 때 비밀번호 확인 :
$input = $_POST['password'];
$stored_hash = getPasswordFromDatabase(); // 데이터베이스에서 검색되었다고 가정하십시오
if (verifyPassword($input, $stored_hash)) {
echo "성공적으로 로그인하십시오";
} else {
echo "오류 비밀번호";
}
crypt () 함수는 더 이상 현대적인 PHP에서 선호되는 도구가 아니지만 특히 오래된 시스템을 유지할 때 알고리즘과 소금 가치 메커니즘을 이해하는 것이 여전히 중요합니다. 호환성과 보안 사이의 균형을 유지하기 위해 안전하게 생성 된 소금 값이있는 Blowfish ( $ 2y $ ) 알고리즘을 사용하는 것이 좋습니다. 또한 더 현대적이고 안전한 솔루션 인 장기적으로 시스템을 Password_hash () 로 전환하는 것이 좋습니다.