2013-01-15 11 views
5

To jest moja pierwsza próba użycia funkcji crypt() w PHP i nie mogę zrozumieć, dlaczego to nie działa. Mój kod jest na podstawie tego artykułu: http://www.techrepublic.com/blog/australia/securing-passwords-with-blowfish/1274PHP crypt() Funkcja Blowfish nie działa

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; 
} 

Zadzwoniłem funkcję próbki z hasłem „password”.

Powstała sól: $2y$10$NzRQNjTRfP4jXKvb4TCO.G
Ale hasło było "$2mV0NZp92R3g" - co wydaje się zdecydowanie zbyt krótkie.

Czy ktoś mógłby mi pomóc wyjaśnić, co robię źle?

+0

Przetestowałem twój przykład i wyprowadza dokładnie to samo, co w tym artykule. Jak wyprowadzać/debugować hasło $. Na stronie internetowej? za cli? – hek2mgl

+0

Właśnie wydrukowałem plik (pominąłem linie kodu). Czy jest wymagana określona wersja PHP dla tej funkcji ...? – user1403777

+0

Jakiej wersji używasz? (Używam: 5.3.10-1ubuntu3.4) – hek2mgl

Odpowiedz

2

Jak napisałeś w swoim komentarzu, używasz PHP 5.2.x.

Implementacja Blowfish jest dostępna tylko w PHP> = 5.3.x. Jeśli z jakiegoś powodu nie można zainstalować nowszej wersji PHP, możesz sprawdzić numer here, aby uzyskać więcej informacji o tym, jak zrobić Blowfish przy użyciu starszych wersji PHP.

+0

user1403777 to rozwiązuje twój problem, nie reagowanie w żaden sposób na odpowiedzi nie jest właściwym sposobem zachowaj się na stackoverflow ... –

1

Od crypt w PHP 5.2 nie obsługuje CRYPT_BLOWFISH, zamiast tego domyślnie interpretuje sól jako sól stylu CRYPT_DES. Zauważ, że dane wyjściowe zaczynają się od "$ 2", który jest solą o dwóch znakach, którą CRYPT_DES wybrał z wejścia solnego i jest dodany do skrótu, a długość wyjściowa odpowiada dokładnej długości wyjściowej CRYPT_DES.

Co ciekawe, można osiągnąć ten sam wynik w późniejszych wersjach PHP z obsługą CRYPT_BLOWFISH, po prostu obcinając sól do dwóch znaków. Tj:

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

W teorii, to może się przydać do zgodności wstecznej czy sól styl CRYPT_BLOWFISH użyto błędu na PHP 5.2.

To rzeczywiście sprawiało mi trochę zamieszania niedawno ponieważ znak „$” nie jest poprawny wejście sól do CRYPT_DES, jak na PHP crypt documentation, który mówi:

Standardowy hash DES oparte o dwa charakterem sól z alfabetu "./0-9A-Za-z". Użycie nieprawidłowych znaków w soli spowoduje, że crypt() nie powiedzie się.

Ale tutaj znak "$" najwyraźniej wydaje się być akceptowany przez crypt() zarówno w wersji 5.2, jak i v5.4.

Byłoby bardziej przejrzyste i bezpieczniejsze, gdyby crypt rzeczywiście zwrócił błąd, jak dokumentacja mówi, że powinien, zamiast akceptować "$" i domyślnie CRYPT_DES.

1

tutaj jest moja funkcja szyfrowania Blowfish ....

<?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

Początkowo tylko Blowfish mieszania z solą począwszy $2a$ był wspierany.

$2x$ i $2y$ Tryby Blowfish zostały dodane w PHP 5.3.7, aby poradzić sobie z potencjalnymi atakami z wysoką prędkością.

Twój PHP 5.2.17 nie obsługuje trybu Blowfish $2y$.

To dlatego twój kod nie działa.