我正在用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
谢谢
答案 0 :(得分:3)
hash()使用十六进制表示([a-f0-9]),而crypt()似乎使用我看到的[a-zA-Z0-9./]。
对于十六进制表示,每个字符包含4个(16个需要4个二进制数字)位信息,对于crypt字符,每个字符包含6个(64个需要6个二进制数字)。
我们知道SHA-512生成512位哈希,所以:
作为示例,看看当我们使用10,16或36个字符来表示数字时会发生什么。
$decimalNumber = 123456789;
var_dump(base_convert($decimalNumber, 10, 16), base_convert($decimalNumber, 10, 36));