PHP crypt()函数VS. hash()函数

时间:2014-05-13 19:14:14

标签: php hash sha512

我正在用PHP创建一个登录系统,我正在体验哈希。

有人可以告诉我为什么如果我使用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

谢谢

1 个答案:

答案 0 :(得分:3)

hash()使用十六进制表示([a-f0-9]),而crypt()似乎使用我看到的[a-zA-Z0-9./]。

对于十六进制表示,每个字符包含4个(16个需要4个二进制数字)位信息,对于crypt字符,每个字符包含6个(64个需要6个二进制数字)。

我们知道SHA-512生成512位哈希,所以:

  • hash():512/4 = 128个字符
  • crypt():512/6 = 85,33~ = 86个字符,如果我们剥离加密模式,舍入和盐($ 6 $ rounds = 5000 $ HGWYWN + gVBLsotI5 $),则与字符长度匹配。在你的例子中,&#34; sxqlewzU4pn4Z0 / .5DlX6orE9Mw2W0Z7VJ6Qp8cCQdDqGvCJHqgiG6fYQjI2dSm78ErfXQ8QbMjq1JCVl2Hah0&#34;

作为示例,看看当我们使用10,16或36个字符来表示数字时会发生什么。

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