2014-05-13 117 views
0

我創建一個登錄系統在PHP中,我遇到哈希。PHP crypt()函數VS.哈希()函數

有人可以告訴我爲什麼如果我使用hash()與sha512它生成一個128字符的字符串,而使用crypt()與sha512它只有118個字符(但只有103個字符的散列)?

實施例:

$password = "password"; 
$hashed = crypt($password, '$6$rounds=5000$'.core::genSalt().'$'); 
$hashed2 = hash('sha512', $password); 

echo "pwd hashed with hash() -> $hashed<br>"; 
echo "hashed pwd length? ".strlen($hashed); 
echo "<br>-----<br>"; 
echo "pwd hashed with crypt() -> $hashed2<br>"; 
echo "hashed pwd length? ".strlen($hashed2); 

並且它導致:

pwd hashed with crypt() -> $6$rounds=5000$HGWYWN+gVBLsotI5$sxqlewzU4pn4Z0/.5DlX6orE9Mw2W0Z7VJ6Qp8cCQdDqGvCJHqgiG6fYQjI2dSm78ErfXQ8QbMjq1JCVl2Hah0 
hashed pwd length? 118 

pwd hashed with hash() -> b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86 
hashed pwd length? 128 

謝謝

+3

[password_hash](http://docs.php.net/manual/en/function.password-hash.php)比兩者更好,它產生在它自己的 –

+0

散列函數鹽AREN沒有加密功能。它們不是爲了扭轉這一過程而設計的。另外:你的回聲是相反的。第一行('$ hashed'的回聲)來自'crypt()'而$ $ hashed2'來自'hash()' – ccKep

+1

@Arian是的,如果OP的PHP是5.5 ---如果不是,那麼使用兼容包(如果PHP <5.5)https://github.com/ircmaxell/password_compat/ –

回答

3

散列()使用的十六進制表示([A-f0-9]),而隱窩( )似乎使用[a-zA-Z0-9.//]從我看到的。

對於十六進制表示,每個字符包含4個(16個需要4個二進制數字)位的信息,對於crypt,每個字符包含6個(64個需要6個二進制數字)。

我們知道,SHA-512產生一個512位的散列,所以:

  • 散列():512/4 = 128個字符
  • 隱窩():512/6 = 85,33〜= 86個字符,如果我們剝離加密模式,回合和鹽($ 6 $ rounds = 5000 $ HGWYWN + gVBLsotI5 $),則與字符長度匹配。在您的例子是「sxqlewzU4pn4Z0/.5DlX6orE9Mw2W0Z7VJ6Qp8cCQdDqGvCJHqgiG6fYQjI2dSm78ErfXQ8QbMjq1JCVl2Hah0」

作爲一個例子,看看當我們使用10,16或36個字符來表示數量會發生什麼。

$decimalNumber = 123456789; 
var_dump(base_convert($decimalNumber, 10, 16), base_convert($decimalNumber, 10, 36)); 
+0

謝謝,完美答案 – lorenzoasr