Strings crypt
(PHP 4, PHP 5, PHP 7, PHP 8)
crypt — 단방향 문자열 해싱
경고 이 함수는 (아직) 바이너리 안전하지 않습니다!
설명
crypt(string $string
, string $salt
): string
crypt()는 표준 Unix DES 기반 알고리즘 또는 대체 알고리즘을 사용하여 해시된 문자열을 반환합니다. password_verify()는 crypt()와 호환됩니다. 따라서 crypt()에 의해 생성된 암호 해시는 password_verify()와 함께 사용할 수 있습니다.
PHP 8.0.0 이전에는 salt
매개변수가 선택 사항이었습니다. 그러나 crypt()는 솔트 없이 약한 해시를 생성하고 salt
없이는 E_NOTICE
오류를 발생시킵니다. 더 나은 보안을 위해 충분히 강한 소금을 지정해야 합니다.
password_hash()는 강력한 해시를 사용하고 강력한 솔트를 생성하며 자동으로 적절한 라운드를 적용합니다. password_hash()는 간단한 crypt() 래퍼이며 기존 암호 해시와 호환됩니다. password_hash() 사용을 권장합니다.
해시 유형은 salt 인수에 의해 트리거됩니다. 솔트가 제공되지 않으면 PHP는 MD5 crypt()의 가용성에 따라 표준 2자(DES) 솔트 또는 12자(MD5)를 자동 생성합니다. PHP는 사용 가능한 해시에서 허용하는 가장 긴 유효한 솔트를 나타내는 CRYPT_SALT_LENGTH
라는 상수를 설정합니다.
표준 DES 기반 crypt()는 출력의 처음 두 문자로 솔트를 반환합니다. 또한 string
의 처음 8자만 사용하므로 동일한 8자로 시작하는 더 긴 문자열은 동일한 결과를 생성합니다(동일한 솔트를 사용하는 경우).
다음 해시 유형이 지원됩니다.
-
CRYPT_STD_DES
- 알파벳 "./0-9A-Za-z"의 두 문자 솔트가 있는 표준 DES 기반 해시입니다. 솔트에 잘못된 문자를 사용하면 crypt()가 실패합니다. -
CRYPT_EXT_DES
- 확장 DES 기반 해시. "salt"는 밑줄 다음에 4자의 반복 횟수와 4개의 소금으로 구성된 9자 문자열입니다. 이러한 4자 문자열 각각은 24비트를 인코딩하며, 최하위 문자가 먼저입니다.0
에서63
까지의 값은./0-9A-Za-z
로 인코딩됩니다. 솔트에 잘못된 문자를 사용하면 crypt()가 실패합니다. -
CRYPT_MD5
- $1$로 시작하는 12자 솔트를 사용한 MD5 해싱 -
CRYPT_BLOWFISH
- 다음과 같이 솔트를 사용한 복어 해싱: "$2a$", "$2x$" 또는 "$2y$", 두 자리 비용 매개변수 "$" 및 알파벳 "./0-9A-Za"의 22자 -지". 솔트에서 이 범위 밖의 문자를 사용하면 crypt()가 길이가 0인 문자열을 반환합니다. 두 자리 비용 매개변수는 기본 Blowfish 기반 해싱 알고리즘에 대한 반복 횟수의 밑이 2인 로그이며 04-31 범위에 있어야 합니다. 이 범위를 벗어난 값은 crypt()가 실패하게 만듭니다. "$2x$" 해시는 잠재적으로 약합니다. "$2a$" 해시는 호환되며 이 약점을 완화합니다. 새 해시의 경우 "$2y$"를 사용해야 합니다. -
CRYPT_SHA256
- $5$ 접두사가 붙은 16자 솔트가 있는 SHA-256 해시. 솔트 문자열이 'rounds=$'로 시작하면 N의 숫자 값은 Blowfish의 비용 매개변수와 마찬가지로 해싱 루프가 실행되어야 하는 횟수를 나타내는 데 사용됩니다. 기본 라운드 수는 5000이며 최소 1000, 최대 999,999,999입니다. 이 범위를 벗어난 N 선택은 가장 가까운 한계로 잘립니다. -
CRYPT_SHA512
- $6$ 접두사가 붙은 16자 솔트가 있는 SHA-512 해시. 솔트 문자열이 'rounds=$'로 시작하면 N의 숫자 값은 Blowfish의 비용 매개변수와 마찬가지로 해싱 루프가 실행되어야 하는 횟수를 나타내는 데 사용됩니다. 기본 라운드 수는 5000이며 최소 1000, 최대 999,999,999입니다. 이 범위를 벗어난 N 선택은 가장 가까운 한계로 잘립니다.
매개변수
string
- 해시할 문자열입니다.
주의 CRYPT_BLOWFISH 알고리즘을 사용하면
string
매개변수가 최대 72바이트 길이로 잘립니다. salt
- 해싱의 기반이 되는 솔트 문자열입니다. 제공되지 않으면 동작은 알고리즘 구현에 의해 정의되며 예기치 않은 결과를 초래할 수 있습니다.
반환 값
해시된 문자열 또는 13자보다 짧고 실패 시 솔트와 다른 문자열을 반환합니다.
경고 암호를 확인할 때 타이밍 공격에 취약하지 않은 문자열 비교 기능을 사용하여 crypt()의 출력을 이전에 알려진 해시와 비교해야 합니다. PHP는 이를 위해 hash_equals()를 제공합니다.
변경 로그
버전 | 설명 |
---|---|
8.0.0 | salt 은 더 이상 선택 사항이 아닙니다. |
Examples
예제 #1 crypt() 예제
<?php
// let the salt be automatically generated; not recommended
$hashed_password = crypt('mypassword');
/* You should pass the entire results of crypt() as the salt for comparing a
password, to avoid problems when different hashing algorithms are used. (As
it says above, standard DES-based password hashing uses a 2-character salt,
but MD5-based hashing uses 12.) */
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "Password verified!";
}
?>
예제 #2 htpasswd와 함께 crypt() 사용
<?php
// Set the password
$password = 'mypassword';
// Get the hash, letting the salt be automatically generated; not recommended
$hash = crypt($password);
?>
예제 #3 다른 해시 유형과 함께 crypt() 사용
<?php
/* These salts are examples only, and should not be used verbatim in your code.
You should generate a distinct, correctly-formatted salt for each password.
*/
echo 'Standard DES: ',
crypt('rasmuslerdorf', 'rl'),
"\n";
echo 'Extended DES: ',
crypt('rasmuslerdorf', '_J9..rasm'),
"\n";
echo 'MD5: ',
crypt('rasmuslerdorf', '$1$rasmusle$'),
"\n";
echo 'Blowfish: ',
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'),
"\n";
echo 'SHA-256: ',
crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$'),
"\n";
echo 'SHA-512: ',
crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$'),
"\n";
?>
위의 예는 다음과 유사한 결과를 출력합니다.
Standard DES: rl.3StKT.4T8M Extended DES: _J9..rasmBYk8r9AiWNc MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0 Blowfish: $2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6 SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
메모
참고: crypt()는 단방향 알고리즘을 사용하기 때문에 암호 해독 함수가 없습니다.
기타
- hash_equals() - 타이밍 공격 안전 문자열 비교
- password_hash() - 비밀번호 해시 생성
- md5() - 문자열의 md5 해시 계산
- 자세한 내용은 crypt 함수에 대한 Unix 매뉴얼 페이지를 참조하십시오.