최신 웹 애플리케이션 개발에서는 사용자 비밀번호의 보안 저장이 중요합니다. PHP의 내장 Crypt () 함수는 Blowfish 암호화 알고리즘을 포함한 다양한 암호화 알고리즘을 지원합니다. Blowfish 알고리즘은 높은 강도 및 사용자 정의 가능한 작업 요소 (비용)에 대해 암호 해싱에 널리 사용됩니다. 이 기사는 PHP의 crypt () 함수를 사용하여 Blowfish 알고리즘 (식별자 $ 2y $ )을 사용하여 암호를 안전하게 암호화하는 방법을 자세히 소개합니다.
Blowfish는 이전 암호화 알고리즘을 대체하기 위해 특별히 설계된 대칭 키 암호화 알고리즘입니다. 암호 해싱의 경우 Blowfish는 조절 가능한 "작업 계수"와 함께 좋은 중대한 무차별 금속 기능을 제공합니다. 작업 계수가 높을수록 암호화를 계산하는 데 시간이 길어 암호 보안이 향상됩니다.
PHP의 crypt () 함수는 $ 2y $ 식별자를 사용하여 Blowfish Hash 형식을 나타내며, 이는 PHP 5.3.7 이상에 권장되는 형식이며, 이는 이전 버전의 보안 문제를 피할 수 있습니다.
Blowfish 알고리즘의 소금은 AZ , AZ , 0-9 , AZ를 포함하는 22 자 문자열입니다 . , / 총 64 자. PHP의 crypt () 에 필요한 소금 형식은 다음과 같습니다.
$2y$ + 두 가지 작업 요소(cost) + $ + 22 약간의 소금
예를 들어:
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
여기서 12는 2^12 해시 계산을 나타내는 작업 요소이며, 이는 약 4096 배이며, 이는 안전하고 너무 느리지 않습니다.
$password = 'your_password_here';
$hash = crypt($password, $salt);
반환 된 $ 해시는 데이터베이스에 직접 저장할 수있는 완전한 Blowfish Hash 문자열입니다.
비밀번호를 확인할 때 원래 해시를 소금으로 사용하여 crypt ()를 호출하고 결과를 비교하십시오.
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
<?php
// 안전한 소금을 생성하십시오
function generate_blowfish_salt($cost = 12) {
if ($cost < 4 || $cost > 31) {
throw new InvalidArgumentException("작업 요소는 있어야합니다4도착하다31~ 사이");
}
$randomBytes = random_bytes(16);
$base64Salt = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64Salt);
}
// 암호화 비밀번호
function encrypt_password($password, $cost = 12) {
$salt = generate_blowfish_salt($cost);
return crypt($password, $salt);
}
// 비밀번호를 확인하십시오
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
// 시험
$password = 'mypassword123';
$hash = encrypt_password($password);
echo "암호 해시: $hash\n";
if (verify_password('mypassword123', $hash)) {
echo "비밀번호 확인이 성공했습니다!\n";
} else {
echo "비밀번호 확인이 실패했습니다!\n";
}
?>
PHP 공식 문서 : https://www.m66.net/manual/zh/function.crypt.php