최신 웹 애플리케이션 개발에서는 사용자 비밀번호의 보안 저장이 중요합니다. PHP는 다양한 비밀번호 암호화 방법을 제공하며, 그중에 Crypt () 함수는 유연하고 강력한 암호화 도구입니다. 이 기사는 PHP의 Crypt () 함수를 사용하여 사용자 비밀번호를 안전하게 암호화하고 검증하는 방법을 소개하고 일반적인 보안 트랩을 피하는 방법을 설명합니다.
crypt () 는 여러 암호화 알고리즘을 지원하는 암호 해시 기능입니다. 특정 알고리즘은 전달한 "소금"에 따라 다릅니다. 다른 알고리즘에는 SHA-256 , SHA-512 등과 같은 다른 소금 형식이 있습니다. Crypt () 의 합리적인 사용은 강력한 암호 해시를 생성하고 크래킹의 어려움을 증가시킬 수 있습니다.
string crypt(string $password, string $salt);
$ 암호는 사용자가 입력 한 일반 텍스트 비밀번호입니다.
$ SALT 는 암호화 알고리즘과 임의의 소금 값을 지정하는 데 사용되어 각 암호화의 결과가 다릅니다.
소금의 기능은 무지개 테이블 공격을 방지하는 것이며 각 암호는 고유 한 소금 값을 가져야합니다. 최신 알고리즘의 경우 소금에는 알고리즘 식별, 반복 수 및 임의의 문자가 포함되어야합니다.
다음 예제는 SHA-512 알고리즘을 기반으로 소금을 생성합니다.
function generateSalt($length = 16) {
$randomBytes = random_bytes($length);
return '$6$rounds=5000$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16) . '$';
}
$ 6 $는 SHA-512를 사용하는 것을 의미합니다.
Rounds = 5000은 해시 반복의 수를 제어 할 수 있으며 시간이 많이 걸리는 것이 더 안전합니다.
임의의 줄은 소금의 독창성을 보장합니다.
위에서 생성 된 소금을 결합하면 다음과 같은 비밀번호를 암호화 할 수 있습니다.
$password = 'user_password_here';
$salt = generateSalt();
$hash = crypt($password, $salt);
$ HASH는 데이터베이스에 저장된 암호 해시 문자열입니다.
확인 중에 암호와 해시를 직접 비교할 수는 없지만 사용자 입력 비밀번호로 Crypt ()을 호출하고 저장된 해시를 소금으로 전달하십시오. 기능은 소금을 자동으로 추출하고 암호를 암호화합니다.
function verifyPassword($inputPassword, $storedHash) {
$hash = crypt($inputPassword, $storedHash);
return hash_equals($hash, $storedHash);
}
Hash_equals ()를 사용하여 타이밍 공격을 방지하고 비교적 안전하게 보장하십시오.
<?php
// 소금 기능을 생성하십시오
function generateSalt($length = 16) {
$randomBytes = random_bytes($length);
return '$6$rounds=5000$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16) . '$';
}
// 등록 할 때 암호화 된 비밀번호
function encryptPassword($password) {
$salt = generateSalt();
return crypt($password, $salt);
}
// 로그인 할 때 비밀번호를 확인하십시오
function verifyPassword($inputPassword, $storedHash) {
$hash = crypt($inputPassword, $storedHash);
return hash_equals($hash, $storedHash);
}
// 예
$userPassword = 'MySecurePass123';
$storedHash = encryptPassword($userPassword);
echo "암호화 된 해시: " . $storedHash . "\n";
$inputPassword = 'MySecurePass123';
if (verifyPassword($inputPassword, $storedHash)) {
echo "비밀번호 확인이 성공했습니다!";
} else {
echo "오류 비밀번호!";
}
?>
보다 현대적이고 안전한 알고리즘을 캡슐화하는 PHP 7.2+의 Password_Hash () 및 Password_Verify ()를 사용해보십시오 . 그러나 특별한 이유로 crypt ()를 사용해야하는 경우 위의 방법을 참조하십시오.
반복 수를 늘리기 위해 비밀번호 해싱 전략을 정기적으로 업데이트하십시오.
데이터베이스에 저장된 해시 문자열에는 소금 및 알고리즘 정보가 포함되어 있으며 소금을 별도로 보관할 필요가 없습니다.