使用'crypt()'为加密提供salt不会影响crypt上的输出+问题

时间:2013-06-16 11:40:48

标签: php crypt

我在PHP页面中有这个代码,我正在运行多次。每次刷新页面时,salt都会更改(应该如此),但哈希输出保持不变。

$iv = mcrypt_create_iv(22);
$ro = rand(6, 9);
$salt = '$2y$'.$ro.'$'.$iv.'$';
echo $salt;
echo '<br />';
$crypt = crypt('test', $salt);
echo $crypt;

随机盐不应该影响输出并使其成为每次刷新页面时加密结果也会发生变化吗?

我还对crypt()提出了一些一般性问题。

您是否有任何方法可以使用此功能的特定散列算法?我想使用blowfish算法。

盐长度/格式会影响它选择哪种算法吗?

最后,河豚算法的盐长度是否总是22个字符,或者只是最大值?

顺便说一句,如果有人想知道(如果回答这些问题很重要并且不明显),我打算使用类似于存储哈希密码的东西。

谢谢你的期待!

1 个答案:

答案 0 :(得分:3)

系统上的crypt()函数不支持“2y”算法。至少基于Linux GLIBC 2.7的系统只知道DES,$ 2a $(河豚),$ 5 $(SHA-256)和$ 6 $(SHA-512)。因此,crypt()函数假定DES并且只将前两个字符“$ 2”作为salt。那当然产生了相同的输出。

尝试使用SHA-512进行安全密码哈希:

$salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
$salt = '$6$';
for($i=0; $i < 8; $i++) { $salt .= $salt_chars[array_rand($salt_chars)]; }
echo "salt=$salt\n";

$crypt = crypt('test', $salt);
echo "crypt=$crypt\n";

关于你的第二个问题,你可以通过启动盐来选择算法。河豚的“$ 2a $”(相当于6美元以上)。有关详细信息,请阅读“man 2 crypt”。对于某些算法,您还可以将更多参数(例如“rounds = 4000”)编码到salt中。

根据crypt()联机帮助页,$ id $后最多可包含16个字符。 较长的盐将被无声地截断并产生与前16个字符相同的输出。

BTW,即使在/ etc / shadow中,密码也只使用SHA-512算法的8个字符的盐。由于盐只是为了使彩虹桌攻击变得更加困难,这似乎已经足够了。