2014-03-12 3 views
0

나는 PHP's crypt() 함수에서 읽고 있습니다. 나는 대부분의 예에서 볼 수있는 소금 문자열의 끝에서 후행 '$'기호의 의미는 무엇
php crypt - 뒤의 달러 기호 - 해시에서 소금 부분 만 빼내십시오. 소금을 채우십시오.

  1. - 나는에 대한 몇 가지 질문이 있습니다. 이 설명서는 소금 줄을 끝내는 방법에 대해 특별히 언급하지 않았습니다.

  2. 어쨌든 해시에서 소금 부분 만 추출 할 수 있습니까? crypt() 함수는 내부적으로 비교를 수행 할 때부터 수행 할 것이기 때문에 필자는 그럴 필요가 없다는 것을 알고 있습니다. 그러나 그것의 단지 지옥을 위해. 소금을보기 위해서.

    $pass = 'secret'; $salt = '$2y$07$usesomesillystringforsalt$'; echo crypt($pass, $salt);

    이의 출력은 $2y$07$usesomesillystringforex.u2VJUMLRWaJNuw0Hu2FvCEimdeYVO이고 나는 소금과 해시 사이의 경계에 대한 확신입니다 - EGS이 코드를 고려하십시오. 소금이나 해시의 'forex'하위 문자열 부분에 'e'가 있습니까? 내가 소금 부분 만 추출하면 훨씬 쉬울거야. "$ 2A 호 $", "$ 배 $"또는 "$의 2Y을 $", 두 자리 :

    또한
  3. 토굴() 서, 다음과 같이 복어는 소금 해싱 ...

    말한다 알파벳 "//09A-Za-z"에서 $, 22 문자로 표시됩니다. ...

    이 항목에서 비용 매개 변수 뒤에 $ 기호 다음에 22자를 입력해야합니다. 그러나이 코드를 고려 -

    $pass = 'secret'; $salt = '$2y$07$somesillystring$'; echo crypt($pass, $salt);

    이의 출력은 $2y$07$somesillystring$$$$$$.O6JLPmGlDvy4BicGmkuBD.DN8OYiIoG입니다. 내 질문은 비용 매개 변수 다음에 $ 기호 다음에 최대 21 자까지만 채워지는 이유입니다. 나는 그것을 최대 22 문자로 패딩 될 것으로 예상했다.

답변

1
  1. 일부 토굴() 알고리즘은 달러 기호 지하실에서 소금을 분리합니다. 복어는 그렇지 않습니다.

  2. PHP는 단순히 소금을 추출하는 기능이 없습니다. 알고리즘과 소금 위치/길이의 연관 배열이 필요합니다.

  3. 왜 21 대 22 문자 차이인지 모르겠습니다. PHP 매뉴얼에 오류가있을 수 있습니까? "man crypt"를 실행하거나 http://linux.die.net/man/3/crypt으로 가십시오.

0

나는 22 번째 문자의 왼쪽 4 비트/니블 만 사용된다는 것을 막연하게 기억합니다. 그러나 실행 후 다음 스 니펫에서는 해싱 전후의 22 번째 문자의 이진 표현 사이의 관계를 볼 수 없습니다. 그러나 22 번째 문자는 결과에 영향을 미칩니다.

$pass = 'secret'; 
$salt = '$2y$07$usesomesillystringforsalt$'; 
$hash = crypt($pass, $salt); 

var_dump(
    $hash, 
    str_split($hash) // the 22th salt character 'e' is on index 28 
); 

function meow($char) { 
    $hash = crypt('secret', '$2y$04$usesomesillystringfor' . $char); 
    $substr = substr($hash, 28, 1); 

    var_dump(
     $hash, 
     $char, 
     decbin(ord($char)), 
     $substr, 
     decbin(ord($substr)), 
     '------------------------------' 
    ); 
} 

$alphabet = str_split('abcdefghijklmnopqrstuvwxyz'); 

foreach($alphabet as $char) { 
    meow($char); 
} 

자신에 대한 참조 :이 엄격하게 문서화되어 있지 않습니다 비록 http://3v4l.org/qQmho

+0

, 당신은 PHP 5.5 이상에 대한 접미사'$ '(5.4 최신 버전의 심지어 일부가 있어야합니다 - 5.4.37 우분투에서 작동하지 않습니다). 좋은 소식은'$ '를 기존 코드에 추가해도 결과가 변경되지 않는다는 것입니다 : http://3v4l.org/VA1dS –