crypt
의 출력 구성
:
- (임의로 알고리즘 식별자 + 부하 인자)
- 사용 된 알고리즘의 염
- 실제 해시
이 출력을 crypt
으로 다시 전달하면 올바른 알고리즘과 소금을 추출하고이를 연산에 사용합니다. 언급 된 알고리즘 만있는 경우이 알고리즘을 사용하여 임의의 소금을 생성합니다. 그렇지 않으면 기본 알고리즘을 선택하고 임의의 소금을 생성합니다. 전달 된 salt 매개 변수의 hash
부분은 무시됩니다.
그래서 단순히 stored_hash와 crypt (password, stored_hash)를 비교할 수 있습니다. 동일하면 올바른 비밀번호 일 가능성이 큽니다.
function crypt($password, $salt)
{
if (substr($salt,0 1) == "_") {
$count = substr($salt, 1, 4);
$real_salt = substr($salt, 5, 4);
return "_" . $count . $real_salt . crypt_ext_des($password, $count, $salt);
}
if(substr($salt, 0, 3) == "$1$") {
list($ignored, $real_salt, $ignored) = explode("$", $salt);
return "$1$" . $real_salt . "$" . crypt_md5($password, $real_salt);
}
if(substr($salt, 0, 4) == "$2a$") {
$cost = substr($salt, 4, 2);
$real_salt = substr($salt, 7, 22);
return "$2a$" . $cost . "$" . $real_salt . crypt_brypt($password, $real_salt, $cost);
}
// ... SHA256 and SHA512 analogons
// no match => STD_DES
$real_salt = substr($salt, 0, 2);
return $real_salt . crypt_std_des($password, $real_salt);
}
개별 crypt_xxx 기능은 다음 알고리즘에 따라 실제 작업을 수행 여기
는 (PHP와 같은 구문)는 의사의 설명 방법 토굴 작품이다. (사실, $ real_salt가 비어 있으면 무작위 소금 생성이 빠져 있습니다.)
* PHP의 ['crypt'] (http : // us2. php.net/manual/en/function.crypt.php)은 5.3 * 이전 버전을 사용하기에 적합하지 않습니다. Blowfish, SHA-256 또는 SHA-512를 얻기 위해'$ 2a $','$ 5 $'또는'$ 6 $'접두어를 항상 사용하고 싶으므로 이전 버전에서는 사용할 수 없다. 자세한 내용은 매뉴얼 페이지를 참조하십시오. – Charles
MD5 용 PHP 5.3.7에서 crypt가 깨졌습니다. 그들은 bugfix 5.3.8을 발표했습니다. –