$salt=bin2hex(mcrypt_create_iv(64, MCRYPT_DEV_RANDOM));
这是我目前创建密码盐的设置。我注意到,当我将注册页面上传到Web主机时,页面执行大约需要1分钟,而在我的本地apache服务器上它是即时的。我把问题缩小到这行代码。您是否了解此函数的任何执行时间问题,或者是否有更好的方法来获取salt字符串(128长度)?
答案 0 :(得分:2)
问题在于MCRYPT_DEV_RANDOM
参数,从中读取将阻止服务器,直到有足够的熵可用。相反,你应该使用:
$binarySalt = mcrypt_create_iv(64, MCRYPT_DEV_URANDOM);
从URANDOM读取是生成盐的最佳选择,它最初从RANDOM中获取,但如果没有足够的熵可以阻止它。这也可以防止有人通过你的功能消耗服务器的熵池。
根据您使用的哈希函数,bin2hex()
函数不是最佳的,因为结果字符串的字母表是有限的。您应该允许哈希函数接受的所有字符。
由于PHP现在有自己的api来生成BCrypt哈希值,我建议直接使用这个函数password_hash(),它确实会创建一个安全的盐。早期的PHP版本还有一个兼容包。