PHP에서 Password_Needs_RHASH 함수는 현재 지정된 알고리즘 및 옵션을 사용하여 암호 해시 값을 다시 해쉬 해야하는지 여부를 결정하는 데 사용됩니다. 시스템의 해싱 정책이 변경되면 (예 : BCrypt 에서 Argon2ID 로의 업그레이드 또는 비용 요인 변경), 사용자가 로그인 할 때 이전 해시를 새로운 표준으로 조용히 업그레이드하는 데 도움이 될 수 있습니다. 그러나 개발자는이 기능을 사용할 때 "비생산적으로 보이는 경우"상황을 만날 수 있습니다. password_needs_rehash가 적용되지 않는 이유를 분석하고 가장 일반적인 이유, 즉 해시 알고리즘 설정 오류를 설명하는 데 집중합시다.
$hash = password_hash('mypassword', PASSWORD_DEFAULT);
$options = ['cost' => 12];
if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
$hash = password_hash('mypassword', PASSWORD_DEFAULT, $options);
}
이 논리는 다음을 의미합니다. 원래 해시가 현재 알고리즘 또는 매개 변수를 준수하지 않으면 재 해적됩니다.
password_needs_rehash 의 핵심 기준은 전달한 알고리즘과 매개 변수 입니다. 이러한 매개 변수를 잘못 설정하면 차이를 판단하지 않아서 업데이트가 필요하지 않다고 생각하여 잘못된 거짓을 반환합니다.
많은 개발자들은 Password_Default를 사용하는 한 PHP가 알고리즘을 자동으로 업그레이드 할 것이라고 생각합니다. 예를 들어:
$oldHash = password_hash('mypassword', PASSWORD_BCRYPT); // 명시 적으로 사용하십시오 bcrypt
그런 다음 다음으로 변경합니다.
$options = ['cost' => 12];
$needsRehash = password_needs_rehash($oldHash, PASSWORD_DEFAULT, $options);
문제는 다음과 같습니다. password_default는 현재 (PHP 8.3 기준) Still Password_Bcrypt 입니다. Password_Needs_Rheash 는 알고리즘이 여전히 bcrypt라고 생각하기 때문에 알고리즘 불일치를 찾지 못합니다. 이 시점에서 당신은 그것이 true를 반환 할 것으로 기대할 수 있지만, 거짓을 반환합니다.
많은 사람들이 비용 매개 변수 (예 : 비용 )를 통과하지만 동일한 비용이 원래 해시 값에서 이미 사용되는 경우 기능은 "재료가 필요하다"고 판단되지 않습니다. [ 'Cost'=> 10]을 수동으로 작성하고 원래 10이면이 경우 기능이 False를 반환합니다.
$hash = password_hash('mypassword', PASSWORD_BCRYPT, ['cost' => 10]);
$needsRehash = password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 10]);
// 결과는 여전히입니다 false,변화가 없기 때문에
변경이 발생할 때 해싱 전략이 올바르게 인식되도록하기 위해 다음과 같은 관행을 권장합니다.
새로운 알고리즘을 명확하게 설정합니다 (예 : Password_bcrypt 에서 Password_argon2id 로 업그레이드);
비용 증가와 같은 비용 매개 변수를 명시 적으로 업데이트합니다.
가능하면 원래 해시 정책을 통합 업그레이드를위한 구성 항목으로 유지하십시오.
$hash = password_hash('mypassword', PASSWORD_ARGON2ID);
$needsRehash = password_needs_rehash($hash, PASSWORD_ARGON2ID, [
'memory_cost' => 1<<17,
'time_cost' => 4,
'threads' => 2
]);
password_needs_rehash가 예상대로 작동하지 않는다고 의심되면 디버깅 중에 해시 문자열을 출력하여 확인할 수 있습니다. 해시 접두사는 일반적으로 사용 된 알고리즘을 나타냅니다.
$ 2y $는 Bcrypt를 의미합니다
$ argon2id $는 argon2id를 의미합니다
이러한 접두사를 관찰하여 새 알고리즘이 실제로 사용되는지 확인할 수 있습니다.
또한 로깅을 통해 현재 구성을 출력하거나 현재 사용중인 해시 정책을 확인하기 위해 배경 관리 페이지를 작성할 수 있습니다.
password_needs_rehash 는 전환 암호 해싱 전략을 매끄럽게하는 데 도움이되는 매우 실용적인 기능이지만 "마법"은 아닙니다. 차이를 판단하기 위해 제공하는 매개 변수에 따라 다릅니다. 잘못 설정하면 해시가 구식이더라도 업데이트가 필요하지 않다고 생각할 수 있습니다. 따라서 해싱 전략 구성을 명확하고 제어 가능하게 유지하는 것이 기능의 효과를 보장하는 핵심입니다.
코드가 필요할 때 코드를 올바르게 결정하는 것이 암호 보안의 진화의 첫 번째 단계입니다. 온라인 프로젝트의 경우 해시 정책을 중앙 집중식으로 구성하고 업그레이드 계획을 정기적으로 평가하여 보안 정책이 과거에 유지되지 않도록하는 것이 좋습니다.