PHP에서 Crypt () 함수는 일회용 암호화의 함수이며, 이는 비밀번호 스토리지와 같은 시나리오에서 일반적으로 발견됩니다. Password_hash () 와 같은보다 현대적인 방법을 사용하는 것이 더 권장되지만 Crypt () 의 작동 메커니즘, 특히 그 개념을 이해하는 것이 여전히 합리적입니다. 이 기사는 crypt () 함수에서 소금의 역할, 형식 및 실제 사용 예를 자세히 소개합니다.
소금은 암호화 될 때 원래 데이터를 방해하기 위해 암호 전후에 추가 된 작은 문자열입니다. 따라서 보안이 향상됩니다. 간단히 말해서, Salt의 기능은 암호화 후 동일한 암호가 다른 결과를 얻을 수 있도록하여 공격자가 테이블 (예 : Rainbow Tables)을 찾아 원래 비밀번호를 다시 출시하지 못하게하는 것입니다.
예를 들어, 두 사용자의 암호가 Password123 인 경우 암호화 값은 소금없이 정확히 동일합니다. 다른 염이 추가되면 암호가 동일하더라도 암호화 결과는 완전히 다릅니다.
PHP에서 Crypt () 의 기본 구문은 다음과 같습니다.
crypt(string $string, string $salt): string
$ string 이 암호화 할 일반 텍스트 비밀번호이고 $ salt는 암호화 알고리즘의 매개 변수입니다 (소금뿐만 아니라 사용 된 알고리즘을 결정합니다).
crypt ()는 여러 암호화 알고리즘을 지원하며 다른 알고리즘에 필요한 소금 형식도 다릅니다. 다음은 몇 가지 일반적인 알고리즘과 소금 형식입니다.
crypt('mypassword', 'rl');
소금 : 두 캐릭터 (총 12 비트)
약한 암호화, 권장되지 않습니다
crypt('mypassword', '$1$abc12345$');
소금 형식 : $ 1 $ + 1-8 자
알고리즘 : MD5 기반
출력 길이 : 34 자
crypt('mypassword', '$2y$10$usesomesillystring22$');
소금 형식 : $ 2y $ + 2 비트 비용 매개 변수 + 22- 문자 Base64 인코딩 된 소금
비용 매개 변수 (위의 예에서 10 에서와 같이) 암호화 강도 제어
출력 길이 : 60 자
crypt('mypassword', '$5$rounds=5000$abcdefgh$'); // SHA-256
crypt('mypassword', '$6$rounds=5000$abcdefgh$'); // SHA-512
소금 형식 : $ 5 $ 또는 $ 6 $ + 선택적 라운드 매개 변수 + 1-16 자 소금
라운드 반복 수를 제어하고 기본값은 5000이며 안전성을 높이기 위해 조정 가능합니다.
실제로 crypt ()를 사용하고 소금 사용자 정의의 예를 살펴 보겠습니다.
<?php
$password = 'securePass123';
$salt = '$2y$12$ABCDEFGHJKLMNPQRSTUVWX'; // Blowfish, 12 비용
$hash = crypt($password, $salt);
echo "암호화 된 비밀번호:$hash";
?>
암호화 된 출력 이이 형식으로 표시됩니다.
$2y$12$ABCDEFGHJKLMNPQRSTUVWXrB92GhFIR77XRkThYs2D5cs1.GgZGq
실제 발전에서, 우리는 무작위 생성 소금을 결합하여 더 높은 보안을 달성 할 수 있습니다.
<?php
function generateBlowfishSalt($cost = 12) {
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$salt = '';
for ($i = 0; $i < 22; $i++) {
$salt .= $chars[random_int(0, 63)];
}
return sprintf('$2y$%02d$%s', $cost, $salt);
}
$password = 'MySecretPass!';
$salt = generateBlowfishSalt();
$hash = crypt($password, $salt);
echo "Salt: $salt\n";
echo "Hash: $hash\n";
?>
사용자가 입력 한 비밀번호가 올바른지 확인하려면 사용자가 입력 한 일반 텍스트 비밀번호를 사용하여 데이터베이스에 저장된 해시 값을 SALT로 다시 Crypt ()를 호출해야합니다. 그런 다음 결과를 비교해야합니다.
<?php
$input = 'MySecretPass!';
$stored_hash = '$2y$12$ABCDEFGHJKLMNPQRSTUVWXrB92GhFIR77XRkThYs2D5cs1.GgZGq';
if (crypt($input, $stored_hash) === $stored_hash) {
echo "올바른 비밀번호!";
} else {
echo "오류 비밀번호。";
}
?>
URL을 사용하여 비밀번호 토큰으로 링크를 리디렉션하는 것과 같은 비즈니스 로직을 수행하려면 URL을 구성 할 때 M66.net 과 같은 도메인 이름을 사용할 수 있습니다.
<?php
$token = crypt('user@example.com', generateBlowfishSalt());
$url = 'https://m66.net/reset-password?token=' . urlencode($token);
echo "링크를 재설정하십시오:" . $url;
?>
이러한 방식으로 구성된 URL은 동일한 이메일 주소조차도 동일한 토큰을 생성하지 않아 보안이 증가하도록합니다.
Salt는 PHP의 Crypt () 함수의 암호화 매개 변수가 아니라 무차별 인력 크래킹 및 반복 암호 공격과 싸우는 핵심 수단입니다. 올바른 암호화 알고리즘 형식을 선택하고 소금을 올바르게 사용함으로써 비밀번호 스토리지의 보안을 크게 향상시킬 수 있습니다. 현대적인 개발은 password_hash () 및 password_verify ()를 사용하는 것이 더 권장되지만 crypt () 의 메커니즘을 이해하면 암호화의 원칙과 위험 보호 전략을 이해하는 데 여전히 도움이 될 수 있습니다.