用PHP生成一个salt

qst*_*ter 12 php random cryptography salt

在PHP中生成加密安全32字节盐的最佳方法是什么,而不依赖于典型PHP安装中很少包含的库?

经过一些谷歌搜索后,我发现它mt_rand不够安全,但我没有找到更换的建议.一篇文章建议阅读,/dev/random但不仅仅是这不适用于Windows; 它也慢.

我希望在安全性和速度之间取得合理的平衡(即,生成512字节不应该花费20秒,就像/dev/random通常那样)

Sco*_*ski 15

这在PHP 7中更容易:只是$salt = random_bytes($numberOfDesiredBytes);用来生成一个盐.

无论如何,你需要什么盐?如果是密码,只需使用password_hash()password_verify().


Amb*_*ber 7

注意:mcrypt已在PHP 7.1中弃用.跳到最新的答案.

您可能需要查看文档(和注释)mcrypt_create_iv().

  • 在PHP 7.1中不推荐使用mcrypt.您不应编写已弃用的代码.因此,如果您在2016年阅读此内容,请不要使用此答案,更喜欢@Scott Arciszewski的答案. (2认同)

mar*_*kli 7

注意:mcrypt已在PHP 7.1中弃用.跳到最新的答案.

您可以使用该功能mycrypt_create_iv(),因为PHP版本5.3它也使用Windows服务器上的随机源(不仅仅是在Unix上).在使用它之前,您应该检查是否MCRYPT_DEV_URANDOM定义了常量.

mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
Run Code Online (Sandbox Code Playgroud)

与随机不同,如果没有足够的熵,则urandom不会阻止服务器.由于密码盐应该是唯一的(不一定是随机的),因此urandom对我来说似乎是一个不错的选择.