如何为每个用户制作绝对原创的盐?time()
在PHP中使用函数更好吗?
4 回答
在许多情况下,一个简单的uniqid(mt_rand(), true)
方法就可以生成随机盐。结合 Blowfish 应该会给你一个很好的密码哈希。
替代方案是伪随机源,例如/dev/urandom
或openssl_pseudo_random_bytes()
。还有一些服务会为您生成随机数据(基于放射性退化)。
使用此行在 php 中生成强盐
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
考虑使用随机盐而不是非随机盐。也许你会在这篇文章中找到有用的东西http://www.gregboggs.com/php-blowfish-random-salted-passwords/
也看看这篇文章http://codahale.com/how-to-safely-store-a-password/
一种方法是为每个用户生成一个唯一的盐并将该盐也存储在数据库中。
另一个好方法是生成密码哈希的算法必须计算 salt 超过 second。您的哈希算法越复杂 - 想要破解您的数据库的人面临的问题就越多
您可以使用microtime()
PHP 中的函数来生成基于微秒而不是秒的数字,这使得用户几乎不可能与另一个用户拥有相同的盐分。您也可以将此数字与用户 ID 相乘。
对于您的应用程序来说,也许 amd5(uniqid())
就足够了。
编辑:忘记在函数中提及 more_entropy 参数uniqid()
。即使函数在同一微秒内运行两次,它也会减少相同字符串的机会,因此编辑后的函数应如下所示:
$salt = md5(uniqid($user_id, TRUE));