2013-01-15 2 views
5

이것은 PHP에서 crypt() 함수를 처음 사용 한 것이므로 왜 작동하지 않는지 알 수 없습니다. 내 코드는이 문서를 기반으로 : 나는 샘플 암호 "암호"로 함수를 호출 http://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274PHP crypt() Blowfish 함수가 작동하지 않습니다.

function blowfishHash ($pw) { 
    //generate random salt 
    $salt = "$2y$10$"; 
    for ($i = 0; $i < 22; $i++) { 
     $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", mt_rand(0, 63), 1); 
    } 
    $hash = crypt($pw, $salt); 

    //printout to file 
    $file = fopen("debug.txt", "w+"); 
    fwrite($file, "\n\n\n".$pw); 
    fwrite($file, "\n\n\n".$salt); 
    fwrite($file, "\n\n\n".$hash); 
    fclose($file); 

    return $hash; 
} 

.

결과 소금은 다음과 같습니다. $2y$10$NzRQNjTRfP4jXKvb4TCO.G
그러나 암호는 "$2mV0NZp92R3g" - 너무 짧게 보입니다.

누군가 내가 잘못하고있는 것을 알아내는 데 도움을 줄 수 있습니까?

+0

예제를 테스트했으며 기사에서와 똑같이 출력합니다. 어떻게 $ 암호를 출력/디버깅합니까? 웹 사이트에서? CLI 당? – hek2mgl

+0

방금 ​​파일에 인쇄했습니다 (코드 줄을 생략했습니다). 이 기능을 위해 PHP의 특정 버전이 필요합니까 ...? – user1403777

+0

어떤 버전을 사용하십니까? (나는 사용하고있다 : 5.3.10-1ubuntu3.4) – hek2mgl

답변

2

의견에 진술 한대로 PHP 5.2.x를 사용하고 있습니다.

블로 휘시 구현은 PHP> = 5.3.x에서만 사용할 수 있습니다. 어떠한 이유로 든 최신 PHP 버전을 설치할 수없는 경우 Blowfish를 이전 PHP 버전과 함께 사용하는 방법에 대한 자세한 내용은 here을 확인하십시오.

+0

user1403777이 방법으로 문제를 해결할 수 있지만 어떤 방식 으로든 응답하지 않으면 올바른 방법이 아닙니다. stackoverflow에서 동작 ... –

1

PHP 5.2의 crypt은 CRYPT_BLOWFISH를 지원하지 않으므로 기본적으로 소금을 CRYPT_DES 스타일의 소금으로 해석하는 것이 기본값입니다. 출력은 "$ 2"로 시작하는데 이는 CRYPT_DES가 소금 입력에서 선택되어 해시 앞에 추가 된 두 개의 문자 소금이고 출력 길이는 정확한 CRYPT_DES 출력 길이와 일치한다는 점에 주목하십시오.

흥미롭게도 소금을 두 자로 잘림으로써 CRYPT_BLOWFISH가 지원되는 이후 PHP 버전에서도 동일한 결과를 얻을 수 있습니다. 즉하십시오 CRYPT_BLOWFISH 스타일 소금은 PHP 5.2에 오류가 사용 된 경우 이론적으로

crypt('password', '$2y$10$NzRQNjTRfP4jXKvb4TCO.G') /* in PHP 5.2 */ 
== 
crypt('password', '$2') /* in PHP 5.4 */ 

, 이것은 이전 버전과의 호환성을 위해 유용하게 사용할 수 있습니다. 은 "$"문자가 말한다 PHP crypt documentation에 따라 CRYPT_DES 유효 소금 입력하지 않기 때문에

실제로 최근에 나에게 혼란을 조금 원인 : 두 개의 문자로

표준 DES 기반의 해시 알파벳 "./0-9A-Za-z"의 소금. 소금에 유효하지 않은 문자를 사용하면 crypt()가 실패합니다.

하지만 여기에서 "$"문자는 v5.2 및 v5.4 모두에서 crypt()에 의해 분명히 허용 된 것으로 보입니다.

crypt이 실제로 "$"를 수락하고 CRYPT_DES를 기본값으로 사용하지 않고 문서가 말하는 것처럼 실패를 반환하면 더 명확하고 안전합니다.

1

여기 내 복어 암호화 기능 .... $2a$로 시작하는 소금 해시

<?php 
    function bcrypt($input, $salt=null, $rounds=12) { 
     if($rounds < 4 || $rounds > 31) $rounds = 12; 
     if(is_null($salt)) $salt = sprintf('$2a$%02d$', $rounds).substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22); 
     return crypt($input, $salt); 
    } 
    $hash = bcrypt('password'); 
    if($hash = bcrypt('password', $hash)) { 
     // password ok 
    } 

?> 
0

처음에만 복어 지원합니다.

$2x$$2y$ 잠재적 인 높은 비트 공격을 처리하기 위해 PHP 5.3.7에서 블로 휘어 모드가 추가되었습니다.

PHP 5.2.17은 복어 모드 $2y$을 지원하지 않습니다.

코드가 작동하지 않는 이유는 무엇입니까?