2013-01-15 94 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.

Blowfish實現僅在PHP> = 5.3.x中可用。如果由於任何原因無法安裝更新的PHP版本,您可以查看here以獲取有關如何使用舊版PHP版本使Blowfish工作的更多信息。

+0

user1403777這是否解決您的問題,沒有以任何方式回答是不是正確的方法在stackoverflow上運行... –

1

由於PHP 5.2中的crypt不支持CRYPT_BLOWFISH,因此默認將salt解釋爲CRYPT_DES風格的salt。請注意,輸出以「$ 2」開頭,這是CRYPT_DES從鹽輸入中選擇並預置到散列的兩個字符鹽,並且輸出長度與確切的CRYPT_DES輸出長度相匹配。有趣的是,通過簡單地將salt截斷爲兩個字符,您可以在以後的PHP版本中獲得與CRYPT_BLOWFISH支持相同的結果。即:

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

從理論上講,這可能會派上用場的向後兼容性,如果風格crypt_blowfish的鹽被錯誤使用的PHP 5.2。

這其實給我帶來了一些混亂最近因爲「$」字符不是CRYPT_DES按照該PHP crypt documentation有效鹽的輸入,它說:

標準基於DES哈希有兩個字符來自字母表「.0-9A-Z-z」的鹽。在鹽中使用無效字符將導致crypt()失敗。

但是這裏「$」字符在v5.2和v5.4中似乎都被crypt()所接受。

如果crypt實際上像文檔所述的那樣返回了故障,而不是接受「$」並且默認爲CRYPT_DES,它會更清晰和更安全。

1

這裏是我的Blowfish加密功能....

與開始 $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$ and $2y$ PHP 5.3.7中增加了Blowfish模式來處理潛在的高位攻擊。

您的PHP 5.2.17不支持$2y$ Blowfish模式。

這就是爲什麼你的代碼不工作。