使用 mcrypt 获取密码盐.在本地 apache 服务器上执行时间很快,但在 Web 主机上执行时间非常慢


Using mcrypt to get a password salt. Execution time is fast on local apache server, but very slow on web host

$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版本的兼容包。