我基本上使用这个:
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ./'; $numChars = strlen($chars); $salt = '$2a$12$'; for($i = 0; $i < 22; ++$i) { $salt .= $chars[mt_rand(0, $numChars - 1)]; }
可以用那个吗?
对于 PHP 5.3.7 或更高版本,我相信这是最好的:
$blowfish_salt = "$2y$10$".bin2hex(openssl_random_pseudo_bytes(22));
对于 PHP 5.5 或更高版本,只需使用带有自动盐创建的新password_hash()
功能。
这很好用。不过,您在随机化盐方面工作得太辛苦了。
你总是可以做一些像这样 $salt = md5(mt_rand()) :)
当你想在下一步保存密码时使用这样的东西。
$encryptedPassword = crypt($userPassword, $salt);
如果您有最新版本的 PHP,这应该默认为河豚
我不知道它是否可以使用,但由于mt_rand
它是基于系统时间的,所以它是可以预测的。最好使用高级随机生成算法openssl_random_pseudo_bytes
或/dev/random
实用程序(如果可用)。
使用 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.'$');