2012-07-16 5 views
0

내가 PHP에서 다음 스크립트를 실행하면 :PHP 암호 함수 결과 : 어떻게 작동합니까?

$hash1 = crypt('test','$2a$08$useasillystringforsalt$');<br/> 
    echo 'hash1:'.$hash1.'<br/>'; 
    $hash2 = crypt('test','$2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6');<br/> 
    echo 'hash2: '.$hash2.'<br/>';  
    $hash3 = crypt('test','$2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6'); 
<br/> 
    echo 'hash3: '.$hash3.'<br/>'; 
    $hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); 
<br/> 
    echo 'hash4: '.$hash4.'<br/>'; 
    $hash5 = crypt('test','$2a$08$useasillystringforsaldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); 
<br/> 
    echo 'hash5: '.$hash5.'<br/>'; 
    $hash6 = crypt('test','$2a$08$useasillystringforsaleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); 
<br/> 
    echo 'hash6: '.$hash6.'<br/>'; 

나는 다음과 같은 결과를 얻을 :

hash1: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash2: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash3: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash4: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash5: $2a$08$useasillystringforsalOnUtWGdo1WqxrpPXy7Lrt0SHVxn5XeU6 
<br/> 
hash6: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 

hash1은의 결과입니다

crypt('test',$2a$08$useasillystringforsalt); 

내 질문은 :

어떻게 모든 결과는 hash5을 제외하고 동일 할 수 있습니까? 나는 소금에있는 사소한 변화가 완전히 다른 결과를 생성 할 것이라고 생각했습니다. 귀하의 경우에는

+0

지하실 문서에 따르면, 토굴은 소금의 첫 22 개 자리에 대한 관심. 즉, 실례 ... 다른 – Wug

답변

1

당신은 표준 DES 기반 토굴 알고리즘을 사용하고 있습니다.

이 경우 소금은 출력의 처음 두 문자로만 반환되므로 매우 긴 소금 문자열에서 문자 하나만 변경하면 여러 개의 "거의 동일한"문자열에 대해 동일한 문자열을 얻을 가능성이 매우 높습니다. 염류. PHP 설명서에서

:

http://php.net/manual/en/function.crypt.php

표준 DES 기반 토굴()는 출력의 처음 두 문자로 소금을 반환합니다. 또한 단지 (같은 소금을 사용하는 경우) 동일한 결과를 생성합니다 같은 8 자 로 시작하는 첫 8 자 STR의 , 너무 긴 문자열을 사용합니다.

+0

음을 오지 않을 왜 잘 모르겠어요했다? 이 성명서는 모든 종류의 암호 원칙을 위반합니다. 참고하시기 바랍니다. – Wug

+0

오케이, 정말 혼란 스럽네요. 그렇다면 소금의 두 문자는 무엇입니까? 그것은 '2a' '우리'인가? 문자열에서 소금은 어디에 있고, 암호 해시는 어디에서 시작합니까? – most

+0

@Wug가 출처를 추가했습니다. –

0

어떤 이유로 든 마지막 문자가 무시됩니다. 어리석은 구현. 아마도 걱정할 필요는 없습니다. 소금 길이 제한에 의해 부과 된 제한을 초과하여 보안을 강화할 수있는 합리적 방법은 없습니다.

+0

@ user1529858 시도해보십시오.결과는 – Wug

+0

입니다. 실제로 Blowfish가 사용됩니다. 그렇습니다. 당신은 달러 기호에 대해 옳았지만 여전히 같은 결과를 보였습니다. – most

+0

어쩌면 문자열의 일부로 널 종결자를 처리하고 있습니다 (버그 일 수 있습니다). 21 번째 문자를 변경해보십시오. – Wug

0

필요 종료 $ :

$hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$');