현재 위치: > 최신 기사 목록> crypt ()를 사용하여 이전 시스템의 비밀번호 처리 로직을 리팩터링하십시오.

crypt ()를 사용하여 이전 시스템의 비밀번호 처리 로직을 리팩터링하십시오.

M66 2025-05-27

비밀번호 처리 로직의 보안은 이전 시스템을 유지하고 업그레이드 할 때 특히 중요합니다. 많은 오래된 시스템에서 사용하는 비밀번호 암호화 방법은 더 이상 안전하지 않으며 쉽게 갈라집니다. PHP는 다른 암호화 알고리즘을 결합하여 보안 해시 값을 생성하여 암호 처리 로직을 재구성하고 시스템 보안을 향상시킬 수있는 crypt () 함수를 제공합니다.

이 기사는 PHP의 crypt () 함수를 사용하고 안전한 소금 및 알고리즘을 결합하며 기존 시스템의 안전하지 않은 암호 암호화 방법을 점차적으로 교체하는 방법을 소개합니다.

1. 왜 crypt () 함수를 사용합니까?

Crypt () 는 PHP의 내장 암호 해시 기능이며 다음과 같은 다양한 암호화 알고리즘을 지원합니다.

  • 데스

  • MD5

  • 블로우 피쉬

  • SHA-256

  • SHA-512

들어오는 소금을 기반으로 해당 알고리즘을 자동으로 선택하여 강도가 높은 암호 해시를 생성 할 수 있으며, 이는 역 반대로 갈라지기가 어렵습니다. MD5 및 SHA1과 같은 함수를 직접 사용하는 것과 비교하여 Crypt () 는 비밀번호 암호화에 더 적합합니다.

2. 기존 시스템 암호 처리의 문제

많은 오래된 시스템에는 간단한 암호 암호화가 있으며 다음과 같은 결함이있을 수 있습니다.

  • 소금없이 단일 해시 (예 : MD5 또는 SHA1)를 사용하면 레인보우 테이블 공격으로 쉽게 갈라질 수 있습니다.

  • 소금은 고정되거나 단순하며 동일한 암호가 동일한 해시를 생성하는 것을 방지 할 수 없습니다.

  • 일반 텍스트 또는 간단한 암호화를 직접 저장하면 누출 위험이 있습니다.

이 모든 것이 시스템의 보안을 크게 줄였습니다.

3. crypt ()를 사용한 비밀번호 암호화의 예

다음 예제는 Blowfish 알고리즘과 결합 된 crypt ()를 사용하여 암호에 대한 해시를 생성하는 방법을 보여줍니다.

 <?php
// 사용자가 제출 한 일반 텍스트 비밀번호
$password = 'user_password';

// 임의의 소금을 생성하십시오,Blowfish알고리즘에는 소금 형식이 필요합니다:$2y$ + cost매개 변수 + 22캐릭터 소금
$cost = 12; // 비용을 계산하십시오,숫자가 클수록 더 안전하지만 리소스 소비가 많을수록.
$salt = sprintf('$2y$%02d$%s', $cost, substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22));

// 사용 crypt() 암호 해시를 생성하십시오
$hash = crypt($password, $salt);

echo "암호 해시 AS: " . $hash;
?>

이 해시 문자열은 데이터베이스에 저장 될 수 있습니다. 암호를 확인할 때 동일한 crypt () 함수를 사용하고 데이터베이스의 해시를 소금 매개 변수로 전달하여 올바른 소금 및 알고리즘을 자동으로 사용하십시오.

4. 비밀번호 확인 예제

비밀번호를 확인하려면 Crypt ()을 한 번만 호출하고 결과를 비교하면됩니다.

 <?php
$input_password = 'user_password'; // 사용자 입력
$stored_hash = '$2y$12$wW5O3K7uGp1oKpJ.HUJZEuWQNUkXpzB1I7N1h7qMm6E82JZXNpM4a'; // 해시는 데이터베이스에 저장되었습니다

if (crypt($input_password, $stored_hash) === $stored_hash) {
    echo "비밀번호 확인이 통과되었습니다";
} else {
    echo "오류 비밀번호";
}
?>

이를 통해 암호가 동일하더라도 다른 소금에 의해 생성 된 해시가 다르므로 보안이 향상됩니다.

5. 오래된 시스템에서 점차적으로 교체하는 방법

  • 기존 암호 저장 방법을 평가하여 명확한 텍스트인지 약한 암호화가 있는지 확인하십시오.

  • 사용자가 로그인 할 때 비밀번호 해시 형식 감지와 같은 설계 마이그레이션 전략 및 이전 형식이 성공적으로 확인되면 Crypt ()를 사용하여 새 해시를 생성하여 이전 해시를 덮어 씁니다.

  • 새 사용자를 추가하거나 암호를 재설정 할 때는 새 암호화 방법을 직접 사용하십시오.

  • 시스템의 전체 보안 구성을 강화하고 로그인 시도 수를 제한하고 HTTPS 사용 및 데이터 전송 보안을 보호하십시오.

6. 일반적인 오해를 피하십시오

  • 소금 생성 논리를 직접 구현하지 마십시오. Random_Bytes () 와 같은 강력한 랜덤 함수를 사용하는 것이 좋습니다.

  • 저비용 알고리즘을 사용하지 말고 비용 매개 변수를 합리적으로 설정하십시오 (예 : Blowfish의 비용> = 12).

  • URL 전송에는 비밀번호 해시를 직접 사용하지 말고 필요한 경우 올바르게 인코딩하고 보호하십시오.

7. 프레임 워크와 라이브러리 결합

시스템이 지원하면 PHP의 기본 Password_hash ()Password_Verify () 함수 (PHP 5.5+)를 결합 할 수 있습니다. 기본 레이어는 Crypt ()를 사용하여보다 간결하고 안전한 인터페이스를 제공합니다.

 <?php
$hash = password_hash('user_password', PASSWORD_BCRYPT);
if (password_verify('user_password', $hash)) {
    echo "비밀번호 확인이 성공했습니다";
}
?>

8. 추가 자원