길이

2013-03-31 3 views
3
PHP 매뉴얼 상태에서

그 :길이

CRYPT_BLOWFISH - 소금과 복어 해싱은 다음과 같습니다 : "$의 2A의 $"는 두 자리의 비용 매개 변수 "$", 22 자리 알파벳 "./0-9A-Za-z".

나는 길이가 22임을 깨달았다. 나는 다음 코드를 썼고 소금의 출력 길이가 인 것을 알아 냈습니다. 입니다.

$encoded = crypt('pass','$2a$08$QAZXSWEDCVFRTGBNHYUJMK'); // Lenght of Q . . . K is 22 
echo $encoded; 

출력 :.

$ (2A) $ 08 $ QAZXSWEDCVFRTGBNHYUJM/CR85.t4YytTnmLXsRJMfbYWopbT8Nu

K소금에 존재하지 않습니다 QAZXSWEDCVFRTGBNHYUJM

있습니다. 내가 이해하지 못하는 것?

+0

나는 당신이 무엇을 요구하고 있는지 잘 모르겠습니다. K가 소금에 있어야하는 이유는 무엇입니까? – Blender

+0

'K'는'salt' 문자열에 있기 때문에 충분하지 않습니다. – msoa

답변

4

이것은 소금이 어떻게 인코딩 되었기 때문입니다. 실제 소금은 128 비트이지만 crypt 형식의 인코딩 된 소금은 22 문자 8 비트/문자 3/4 = 132 비트입니다. 따라서 인코딩 된 소금의 4 비트는 실제로 사용되지 않습니다. 여기

$hashes = array(); 
$chars = array_merge(array('.','/'), range('A','Z'), range('a','z'), range('0','9')); 
foreach ($chars as $char) { 
    $salt = 'QAZXSWEDCVFRTGBNHYUJM'.$char; 
    $hashes[$salt] = crypt('pass','$2a$08$'.$salt); 
} 
var_dump($hashes); 

동일한 해시 결과 부호화 염 :

이 또한 최하위 캐릭터의 제 4 비트가 동일한 동일한 해시 결과 16 인코딩 염이 있다는 것을 의미 :

QAZXSWEDCVFRTGBNHYUJM. 
QAZXSWEDCVFRTGBNHYUJM/ 
QAZXSWEDCVFRTGBNHYUJMA 
QAZXSWEDCVFRTGBNHYUJMB 
QAZXSWEDCVFRTGBNHYUJMC 
QAZXSWEDCVFRTGBNHYUJMD 
QAZXSWEDCVFRTGBNHYUJME 
QAZXSWEDCVFRTGBNHYUJMF 
QAZXSWEDCVFRTGBNHYUJMG 
QAZXSWEDCVFRTGBNHYUJMH 
QAZXSWEDCVFRTGBNHYUJMI 
QAZXSWEDCVFRTGBNHYUJMJ 
QAZXSWEDCVFRTGBNHYUJMK 
QAZXSWEDCVFRTGBNHYUJML 
QAZXSWEDCVFRTGBNHYUJMM 
QAZXSWEDCVFRTGBNHYUJMN 

crypt

아마도 단지 내부적 QAZXSWEDCVFRTGBNHYUJM. 128 비트 염을 사용하는 암호화 제 이용한다.

+0

이것을 이해하지 못한다 :'3/4 = 132 bit. '복용량이란 무엇입니까? – msoa

+1

@msoa [Base64] (http://en.wikipedia.org/wiki/Base64)는 4 바이트의 인코딩 된 출력으로 3 바이트의 입력을 인코딩합니다. 그리고 역 과정에서 4 바이트의 인코딩 된 입력이 3 바이트의 출력으로 디코딩됩니다. 이것이 22 바이트의 Base64로 인코딩 된 데이터가 132 비트의 디코딩 된 데이터가되는 이유입니다. – Gumbo

+0

** 더 쉽게 : ** 각각의 Based64 인코딩 된 문자는 6 비트를 사용합니다. '22 * 6 = 132' – msoa