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 매뉴얼 페이지를 참조하십시오.