현재 위치: > 최신 기사 목록> PHP의 crypt () 함수를 사용하여 보안 암호화를 위해 Blowfish 암호화 알고리즘 ($ 2y $)을 구현하는 방법은 무엇입니까?

PHP의 crypt () 함수를 사용하여 보안 암호화를 위해 Blowfish 암호화 알고리즘 ($ 2y $)을 구현하는 방법은 무엇입니까?

M66 2025-06-23

최신 웹 애플리케이션 개발에서는 사용자 비밀번호의 보안 저장이 중요합니다. PHP의 내장 Crypt () 함수는 Blowfish 암호화 알고리즘을 포함한 다양한 암호화 알고리즘을 지원합니다. Blowfish 알고리즘은 높은 강도 및 사용자 정의 가능한 작업 요소 (비용)에 대해 암호 해싱에 널리 사용됩니다. 이 기사는 PHP의 crypt () 함수를 사용하여 Blowfish 알고리즘 (식별자 $ 2y $ )을 사용하여 암호를 안전하게 암호화하는 방법을 자세히 소개합니다.

Blowfish 암호화 알고리즘은 무엇입니까?

Blowfish는 이전 암호화 알고리즘을 대체하기 위해 특별히 설계된 대칭 키 암호화 알고리즘입니다. 암호 해싱의 경우 Blowfish는 조절 가능한 "작업 계수"와 함께 좋은 중대한 무차별 금속 기능을 제공합니다. 작업 계수가 높을수록 암호화를 계산하는 데 시간이 길어 암호 보안이 향상됩니다.

PHP의 crypt () 함수는 $ 2y $ 식별자를 사용하여 Blowfish Hash 형식을 나타내며, 이는 PHP 5.3.7 이상에 권장되는 형식이며, 이는 이전 버전의 보안 문제를 피할 수 있습니다.

php의 crypt () 함수를 사용한 Blowfish 암호화

1. 소금을 생성하십시오

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 배이며, 이는 안전하고 너무 느리지 않습니다.

2. crypt () 함수를 사용하여 암호를 암호화합니다

 $password = 'your_password_here';
$hash = crypt($password, $salt);

반환 된 $ 해시는 데이터베이스에 직접 저장할 수있는 완전한 Blowfish Hash 문자열입니다.

3. 비밀번호를 확인하십시오

비밀번호를 확인할 때 원래 해시를 소금으로 사용하여 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";
}
?>

관련 링크