在PHP中生成加密安全32字节盐的最佳方法是什么,而不依赖于典型PHP安装中很少包含的库?
经过一些谷歌搜索后,我发现mt_rand
被认为不够安全,但我没有找到更换的建议。一篇文章建议从/dev/random
阅读,但不仅仅是这不适用于Windows;它也非常慢。
我希望在安全性和速度之间取得合理的平衡(即,生成512字节不应该花费20秒,如/dev/random
通常那样)
答案 0 :(得分:13)
这在PHP 7中更容易:
只需使用$salt = random_bytes($numberOfDesiredBytes);
生成盐。
无论如何,你需要什么盐?如果是密码,只需使用password_hash()
和password_verify()
。
答案 1 :(得分:7)
注意:PHP 7.1中已弃用
mcrypt
。 Skip to the up-to-date answer
您可能需要查看mcrypt_create_iv()
的文档(和评论)。
答案 2 :(得分:7)
注意:PHP 7.1中已弃用
mcrypt
。 Skip 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是可预测的 这听起来很奇怪,因为盐总是假设为公开的 - 因此,根本没有用于预测。