我可以用它来生成PHP CRYPT_BLOWFISH盐吗?

时间:2012-08-18 03:51:09

标签: php salt blowfish

我基本上是用这个:

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./';
$numChars = strlen($chars);
$salt = '$2a$12$';

for($i = 0; $i < 22; ++$i) {
    $salt .= $chars[mt_rand(0, $numChars - 1)];
}

可以使用吗?

4 个答案:

答案 0 :(得分:1)

对于PHP 5.3.7或更高版本,我相信这是最好的:

$blowfish_salt = "$2y$10$".bin2hex(openssl_random_pseudo_bytes(22));

对于PHP 5.5或更高版本,只需使用新的password_hash() function创建自动盐。

答案 1 :(得分:0)

这很好用。你工作太辛苦了,你的盐随机化了。 你总是可以像这样做一些阴暗的$ salt = md5(mt_rand()):)
当你想在下一步保存密码时,只需使用类似的东西即可。

    $encryptedPassword = crypt($userPassword, $salt);

如果你有最新版本的PHP

,这应该默认为blowfish

答案 2 :(得分:0)

我不知道是否可以使用,但由于mt_rand基于系统时间,因此可以预测。如果它可用,最好使用优秀的随机生成算法,如openssl_random_pseudo_bytes/dev/random实用程序。

请参阅:https://stackoverflow.com/a/6337021/454533

答案 3 :(得分:0)

使用Blowfish只需要21个字符,其余的就会被遗忘。

这部分$2a$12$不是算法和成本(哈希的迭代)的盐。

你的盐可以简单地通过sha1制作,然后返回前21个字符:

$salt = substr(sha1($_SERVER['HTTP_HOST'].uniqid().microtime(true)),0,21);

类似于:

$algo = '$2a$12$'; //Keep this safe

//store along side hash as the salt, for future compares
$salt = substr(sha1($_SERVER['HTTP_HOST'].uniqid().microtime(true)),0,21);

$hash = crypt('The string to be hashed', $algo.$salt.'$');