password_hash

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

password_hash — 암호 해시를 생성합니다.


설명

password_hash(string $password, string|int|null $algo, array $options = []): string

password_hash()는 강력한 단방향 해싱 알고리즘을 사용하여 새 비밀번호 해시를 생성합니다. password_hash()crypt()와 호환됩니다. 따라서 crypt()에 의해 생성된 암호 해시는 password_hash()와 함께 사용할 수 있습니다.

현재 지원되는 알고리즘은 다음과 같습니다.

  • PASSWORD_DEFAULT - bcrypt 알고리즘을 사용합니다(기본값 PHP 5.5.0). 이 상수는 새롭고 강력한 알고리즘이 PHP에 추가됨에 따라 시간이 지남에 따라 변경되도록 설계되었습니다. 이러한 이유로 이 식별자를 사용한 결과의 길이는 시간이 지남에 따라 변경될 수 있습니다. 따라서 60자를 초과하여 확장할 수 있는 데이터베이스 열에 결과를 저장하는 것이 좋습니다(255자가 좋은 선택임).
  • PASSWORD_BCRYPT - CRYPT_BLOWFISH 알고리즘을 사용하여 해시를 만듭니다. 이것은 "$2y$" 식별자를 사용하여 표준 crypt() 호환 해시를 생성합니다. 결과는 항상 60자 문자열이거나 실패 시 false입니다.
  • PASSWORD_ARGON2I - Argon2i 해싱 알고리즘을 사용하여 해시를 만듭니다. 이 알고리즘은 PHP가 Argon2 지원으로 컴파일된 경우에만 사용할 수 있습니다.
  • PASSWORD_ARGON2ID - Argon2id 해싱 알고리즘을 사용하여 해시를 만듭니다. 이 알고리즘은 PHP가 Argon2 지원으로 컴파일된 경우에만 사용할 수 있습니다.

PASSWORD_BCRYPT에 대해 지원되는 옵션:

  • salt(string) - 비밀번호를 해싱할 때 사용할 솔트를 수동으로 제공합니다. 이것은 솔트가 자동으로 생성되는 것을 무시하고 방지합니다.

    생략하면 해시된 각 암호에 대해 password_hash()에 의해 임의의 솔트가 생성됩니다. 이것은 의도된 작동 모드입니다.

    경고 salt 옵션은 더 이상 사용되지 않습니다. 이제 기본적으로 생성되는 솔트를 사용하는 것이 좋습니다. PHP 8.0.0부터 명시적으로 주어진 솔트는 무시됩니다.

  • cost(int) - 사용해야 하는 알고리즘 비용을 나타냅니다. 이러한 값의 예는 crypt() 페이지에서 찾을 수 있습니다.

    생략하면 기본값 10이 사용됩니다. 이것은 좋은 기준 비용이지만 하드웨어에 따라 증가시키는 것을 고려할 수 있습니다.

PASSWORD_ARGON2IPASSWORD_ARGON2ID에 대해 지원되는 옵션:

  • memory_cost(int) - Argon2 해시를 계산하는 데 사용할 수 있는 최대 메모리(kibibytes)입니다. 기본값은 PASSWORD_ARGON2_DEFAULT_MEMORY_COST입니다.
  • time_cost(int) - Argon2 해시를 계산하는 데 걸리는 최대 시간입니다. 기본값은 PASSWORD_ARGON2_DEFAULT_TIME_COST입니다.
  • threads(int) - Argon2 해시를 계산하는 데 사용할 스레드 수입니다. 기본값은 PASSWORD_ARGON2_DEFAULT_THREADS입니다.

    경고 PHP가 libsodium 구현이 아닌 libargon2를 사용하는 경우에만 사용할 수 있습니다.


매개변수

password
사용자의 암호입니다.

주의 PASSWORD_BCRYPT를 알고리즘으로 사용하면 password 매개변수가 최대 72자까지 잘립니다.

algo
암호를 해시할 때 사용할 알고리즘을 나타내는 암호 알고리즘 상수입니다.
options
옵션을 포함하는 연관 배열입니다. 각 알고리즘에 대해 지원되는 옵션에 대한 문서는 암호 알고리즘 상수를 참조하십시오.

생략하면 임의의 솔트가 생성되고 기본 비용이 사용됩니다.


반환 값

해시된 암호를 반환합니다.

사용된 알고리즘, 비용 및 소금은 해시의 일부로 반환됩니다. 따라서 해시를 확인하는 데 필요한 모든 정보가 포함됩니다. 이를 통해 password_verify() 함수는 솔트 또는 알고리즘 정보를 별도로 저장할 필요 없이 해시를 확인할 수 있습니다.


변경 로그

버전 설명
8.0.0 password_hash()는 더 이상 실패 시 false를 반환하지 않습니다.
8.0.0 algo 매개변수는 이제 nullable입니다.
7.4.0 algo 매개변수는 이제 문자열을 예상하지만 이전 버전과의 호환성을 위해 여전히 int를 허용합니다.
7.4.0 sodium 확장은 Argon2 암호에 대한 대체 구현을 제공합니다.
7.3.0 PASSWORD_ARGON2ID를 사용하여 Argon2id 암호에 대한 지원이 추가되었습니다.
7.2.0 PASSWORD_ARGON2I를 사용하여 Argon2i 암호에 대한 지원이 추가되었습니다.

Examples

예제 #1 password_hash() 사용

                  
<?php
/**
 * We just want to hash our password using the current DEFAULT algorithm.
 * This is presently BCRYPT, and will produce a 60 character result.
 *
 * Beware that DEFAULT may change over time, so you would want to prepare
 * By allowing your storage to expand past 60 characters (255 would be good)
 */
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
                

예제 #2 password_hash() 예제 수동으로 비용 설정

                  
<?php
/**
 * In this case, we want to increase the default cost for BCRYPT to 12.
 * Note that we also switched to BCRYPT, which will always be 60 characters.
 */
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K
                

예제 #3 좋은 비용을 찾는 password_hash() 예제

                  
<?php
/**
 * This code will benchmark your server to determine how high of a cost you can
 * afford. You want to set the highest cost that you can without slowing down
 * you server too much. 8-10 is a good baseline, and more is good if your servers
 * are fast enough. The code below aims for ≤ 50 milliseconds stretching time,
 * which is a good baseline for systems handling interactive logins.
 */
$timeTarget = 0.05; // 50 milliseconds

$cost = 8;
do {
    $cost++;
    $start = microtime(true);
    password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);
    $end = microtime(true);
} while (($end - $start) < $timeTarget);

echo "Appropriate Cost Found: " . $cost;
?>
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

Appropriate Cost Found: 10
                

예제 #4 Argon2i를 사용한 password_hash() 예제

                  
<?php
echo 'Argon2i hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
                

노트

주의 이 함수에 대해 자체 솔트를 생성하지 않는 것이 좋습니다. 지정하지 않으면 보안 솔트가 자동으로 생성됩니다.

위에서 언급했듯이 PHP 7.0에서 salt 옵션을 제공하면 사용 중단 경고가 생성됩니다. 수동으로 솔트 제공에 대한 지원은 향후 PHP 릴리스에서 제거될 수 있습니다.


메모: 서버에서 이 함수를 테스트하고 함수 실행이 대화식 시스템에서 100밀리초 미만이 되도록 비용 매개변수를 조정하는 것이 좋습니다. 위 예의 스크립트는 하드웨어에 대한 적절한 비용 가치를 선택하는 데 도움이 됩니다.


참고 이 함수에 의해 지원되는 알고리즘에 대한 업데이트(또는 기본 알고리즘에 대한 변경)는 다음 규칙을 따라야 합니다.

  • 모든 새 알고리즘은 기본이 되기 전에 PHP의 최소 1개 전체 릴리스에 대해 코어에 있어야 합니다. 따라서 예를 들어 새 알고리즘이 7.5.5에 추가되면 7.7이 될 때까지 기본값에 적합하지 않습니다(7.6이 첫 번째 정식 릴리스이기 때문에). 그러나 7.6.0에 다른 알고리즘이 추가된 경우 7.7.0에서도 기본 설정 대상이 됩니다.
  • 기본값은 전체 릴리스(7.3.0, 8.0.0 등)에서만 변경되어야 하며 개정 릴리스에서는 변경되지 않아야 합니다. 이에 대한 유일한 예외는 현재 기본값에서 심각한 보안 결함이 발견되는 긴급 상황입니다.

기타