2011-08-23 2 views
2

일반적으로 암호가 있다면이 의사 코드를 사용합니다.PHP의 crypt() 함수에 대한 salt 인수와 반환 값은 어떻게 작동합니까?

$password = "this is the user's password"; 
/***/ 
$salt = GenerateSalt(); 
$hash = Hash($password); 
$hash = Hash($hash . $salt); 

그러나 PHP는 crypt() 함수를 사용하여 특정 알고리즘의 반복 횟수와 소금을 사용합니다. 분명히 .. crypt의 반환 된 해시를crypt에 소금으로 전달해야합니다. 난 그것을 이해하지 못 했어.

누구나 크립트가 작동하는 방법을 명확히 설명해 주시겠습니까? 나 자신의 소금을 덧붙여 다시 칠할 필요가 있니? 이 경우, 나는 토굴을 위해 고정 된 소금을 사용하고 각 사용자에 대해 별도의 암호를 생성합니까? 아니면 crypt의 $salt 매개 변수가 나를 대신 처리합니까?

+1

* PHP의 ['crypt'] (http : // us2. php.net/manual/en/function.crypt.php)은 5.3 * 이전 버전을 사용하기에 적합하지 않습니다. Blowfish, SHA-256 또는 SHA-512를 얻기 위해'$ 2a $','$ 5 $'또는'$ 6 $'접두어를 항상 사용하고 싶으므로 이전 버전에서는 사용할 수 없다. 자세한 내용은 매뉴얼 페이지를 참조하십시오. – Charles

+0

MD5 용 PHP 5.3.7에서 crypt가 깨졌습니다. 그들은 bugfix 5.3.8을 발표했습니다. –

답변

5
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가 비어 있으면 무작위 소금 생성이 빠져 있습니다.)

+0

그래서 "해시"는 실제로 소금과 해시이며, 일반적으로 MySQL 데이터베이스에서 이것을 하나의 값으로 저장하겠습니까? –

+0

알고리즘 식별자, 소금 및 해시 모두입니다. 그리고 네, 당신은 하나의 varchar 값으로 데이터베이스에 전체 반환 값을 저장합니다. –

0

크립트 일방향 해싱

MD5

같은 것은 그것을 사용한다 설명서

<?php 
$password = crypt('mypassword'); // let the salt be automatically generated 

/* 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 (crypt($user_input, $password) == $password) { 
    echo "Password verified!"; 
} 
?> 
+0

정확하게 저의 질문이었습니다. 'if (crypt ($ user_input, $ password) == $ password)'는 실제로 나에게 의미가 없습니다. 해쉬였던'$ password'를 왜 소금으로 전달하고 있습니까? –

+0

crypt ('mypassword')는 암호가 아닌 소금을 생성합니다. – genesis

관련 문제