현재 위치: > 최신 기사 목록> crypt () + random_bytes ()는 더 안전한 소금 값을 생성합니다

crypt () + random_bytes ()는 더 안전한 소금 값을 생성합니다

M66 2025-06-02

보안은 PHP에서 사용자 비밀번호를 처리 할 때 항상 개발자에게 가장 관심있는 문제 중 하나입니다. PHP의 password_hash () 함수는 암호를 저장하는 편리하고 안전한 방법을 제공했지만 일부 특정 시나리오에서 개발자는 여전히 Crypt ()를 사용하여보다 자세한 제어를 선택할 수 있습니다. 이 기사는 Random_Bytes ()를 결합하여 암호 저장의 보안을 개선하여 안전한 소금 값을 생성하는 방법을 소개합니다.

소금 값이 왜 그렇게 중요한가?

Salt는 암호 전후에 추가되고 해싱 작업에 참여하는 임의의 데이터이며, 두 사용자가 동일한 암호를 사용하더라도 결국 발생하는 해시 값도 다릅니다. 소금 값이나 고정 소금 값을 사용하지 않으면 암호가 무지개 테이블 공격사전 공격 에 더 취약 해집니다.

crypt () 사용의 기본 사용

crypt () 는 암호 해싱의 함수입니다. DES , MD5 , SHA-256 , SHA-512 와 같은 여러 해싱 알고리즘을 지원합니다. 그중에서도 SHA-256SHA-512 가 현재 가장 권장되는 옵션입니다.

SHA-512 알고리즘을 사용한 crypt () 의 예 :

 $password = 'examplePassword';
$salt = '$6$rounds=5000$usesomesillystringforsalt$';
$hash = crypt($password, $salt);

$ 6 $는 여기에서 SHA-512를 사용하는 것을 의미합니다. Rounds = 5000은 5000 개의 반복을 의미하며 다음 문자열은 소금 값입니다.

Random_bytes ()를 사용하여 안전한 소금 값을 생성하십시오

정적 문자열을 사용하는 것과 비교할 때 Random_bytes ()는 안전한 소금 값을 구축하는 데 이상적 인 진정으로 암호화 된 강력한 임의 바이트 스트림을 생성 할 수 있습니다.

다음은 random_bytes ()crypt ()를 결합하여 암호를 안전하게 해시하는 방법을 보여주는 완전한 예입니다.

 function generateSalt($length = 16) {
    // 지정된 길이의 임의 바이트를 생성합니다,그리고 변환 Base64,다시 제거하면 영향을 줄 수 있습니다 crypt() 캐릭터
    $rawSalt = base64_encode(random_bytes($length));
    // 분명한 '+'、'/' 그리고 '=',적합합니다 crypt() 필요하다
    $cleanSalt = str_replace(['+', '/', '='], '', $rawSalt);
    return substr($cleanSalt, 0, $length);
}

function hashPassword($password) {
    $salt = generateSalt();
    $fullSalt = '$6$rounds=10000$' . $salt . '$';
    return crypt($password, $fullSalt);
}

function verifyPassword($password, $hash) {
    return hash_equals($hash, crypt($password, $hash));
}

사용의 예

 $userPassword = 'mySecret123';
$hashed = hashPassword($userPassword);

// 저장 $hashed 데이터베이스로 이동하십시오

// 로그인을 확인할 때
$inputPassword = 'mySecret123';
if (verifyPassword($inputPassword, $hashed)) {
    echo '올바른 비밀번호';
} else {
    echo '오류 비밀번호';
}

주목해야 할 것

  1. 소금 값 길이 제어 : crypt ()는 소금 값 길이에 대한 요구 사항이 있으며, 일반적으로 16 자로 제한되며 초과 부분은 잘립니다.

  2. 소금 값을 재사용하지 마십시오 : 암호 해시가 생성 될 때마다 새로운 임의의 소금 값을 사용해야합니다.

  3. 수동으로 해시 구조를 구축하지 마십시오 : 소금 구조 (예 : $ 6 $ Rounds = 100000 $ salt $ )를 수동으로 스플릿 할 수 있지만 잠재적 오류를 피하기 위해 공식 방법 (예 : Password_hash () )를 사용하는 것이 좋습니다.

  4. 업그레이드 제안 : 특정 요구 사항이 아닌 경우 내부적으로 소금 값 및 알고리즘 선택을 자동으로 처리하는 Password_Hash ()Password_Verify ()를 사용하는 것이 좋습니다.

요약

Random_Bytes ()Crypt () 를 결합하여 개발자는 암호 암호화의 각 링크를 수동으로 제어하고 암호 저장의 임의성과 예측 불가능 성을 개선하여 더 많은 공격 시나리오에 저항 할 수 있습니다. 특히 안전 요구 사항이 높은 시스템 에서이 방법은 기존 정적 소금 값보다 더 높은 보증을 제공합니다.

보안을 더욱 강화 해야하는 경우 해싱 결과를 다른 사용자 식별자 (예 : 사서함, 사용자 이름 등)와 결합하거나 나트륨 과 같은보다 현대적인 암호화 라이브러리를 사용하는 것을 고려할 수도 있습니다. 그러나 전제는 항상 다음과 같습니다. 신뢰할 수있는 임의의 소금 값을 사용하는 것이 암호 보안의 첫 번째 단계입니다.

실제 배포에서는 전체 사이트에서 HTTPS가 활성화되고 데이터베이스 권한 및 백업 정책을 올바르게 관리하여 일반 텍스트 비밀번호와 약한 암호화 방법이 시스템 보안에서 약점이되는지 확인하십시오.