用PHP生成一个salt

时间:2010-03-25 07:33:01

标签: php random cryptography salt

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

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

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

8 个答案:

答案 0 :(得分:13)

这在PHP 7中更容易:  只需使用$salt = random_bytes($numberOfDesiredBytes);生成盐。

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

答案 1 :(得分:7)

  

注意:PHP 7.1中已弃用mcryptSkip to the up-to-date answer

您可能需要查看mcrypt_create_iv()的文档(和评论)。

答案 2 :(得分:7)

  

注意:PHP 7.1中已弃用mcryptSkip to the up-to-date answer

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

mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);

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

答案 3 :(得分:2)

uniqueid 不适合生成随机字符串,因为它也基于microtime。 CPU循环通常比microtime-tick短得多,这可能导致循环内给定变量的可能恒定。 将第二个参数“entropy”设置为true,

 uniqid('', true)

将提供更高的随机性。

要获得与大多数字符集兼容的随机字符串,可以将base64编码应用于 mcrypt 启动向量函数mcrypt_create_iv

$length = 16;
base64_encode(mcrypt_create_iv(ceil(0.75*$length), MCRYPT_DEV_URANDOM))
//> hlZuRJypdHFQPtI2oSFrgA==
strlen(base64_encode(mcrypt_create_iv(ceil(0.75*$length), MCRYPT_DEV_URANDOM)))
//> 16

将字符字母缩小为2 ^ 6Bit会增加大小,这可以在上面说明。

答案 4 :(得分:0)

/dev/urandom读取,或使用openssl_random_pseudo_bytes()

答案 5 :(得分:0)

看起来这个问题的答案是可以接受的,但我只是想在稍作研究后再声明一下,并阅读此主题,如果您不把所有鸡蛋都放在一个篮子里,则可能会增加一些安全性。

我可能建议不要仅依靠PHP来创建盐和哈希密码。如果让数据库完成部分工作,则可以使解决方案更加混乱。

有人建议只使用password_hash()和password_verify()。虽然这些方法很不错,但我强烈建议您坚持在这些方法之外加入盐的想法。

要回答这个问题,盐可以是任何真正随机且强制实施为用户唯一的盐。只要您遵循这两个规则,就可以从技术上生成它。

一些好的资源:

https://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right https://auth0.com/blog/adding-salt-to-hashing-a-better-way-to-store-passwords/

答案 6 :(得分:-3)

uniqid()应该可以用于此目的。

答案 7 :(得分:-8)

我认为microtime()就足够了。

奇怪的是,但我仍然对这个答案有所了解。

虽然我得到的唯一解释是microtime是可预测的 这听起来很奇怪,因为盐总是假设为公开的 - 因此,根本没有用于预测。