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