我正在开发一个网站在PHP 5.4,我想知道这是更好地使用到根密码安全随机盐?
$salt = sha1(openssl_random_pseudo_bytes(23));
要么
$seed = '';
$a = @fopen('/dev/urandom','rb');
$seed .= @fread($a,23);
$salt = sha1(seed);
或者我应该去:
$salt = openssl_random_pseudo_bytes(40);
要么
$salt = '';
$a = @fopen('/dev/urandom','rb');
$salt .= @fread($a,23);
为了安全起见,你是关闭使用更好的openssl_random_pseudo_bytes
。 OpenSSL的负责搜集足够的熵的为您服务良好的随机性。 /dev/urandom
被设计为从不阻止,并可能被欺骗,给你不那么随机字节。
用随机字节你不需要通过SHA1来运行它们。
总之这一切,这样做:
$salt = openssl_random_pseudo_bytes(40, $cstrong);
if (! $cstrong) {
exit('This should not happen');
}
在实践中,几乎可以肯定是没有什么区别。
既openssl_random_pseudo_bytes
和/dev/urandom
提供的伪随机字节的加密的安全来源。 无论是保证是真正随机的,但在实践中,两者都有望通过任何已知的或可预见的技术是从真正的随机性区别。
Kmkaplan是指出,技术上是正确/dev/urandom
可以在一定条件下返回理论上预测的输出,在指出man unrandom
:
“从在/ dev / urandom的装置的读不会阻塞等待更多的熵。其结果是,如果没有在熵池中足够熵,返回的值在理论上是易受由驾驶员使用的算法的密码攻击。如何做到这一点的知识是不是在目前的机密文献中获得的,但它在理论上是可能的,这样的攻击可能存在的。如果这是你的应用程序,使用/ dev目录下的关注/随机代替。”
然而,同样是实际真正openssl_random_pseudo_bytes
(其中调用 OpenSSL的功能RAND_pseudo_bytes
内部),作为中指出OpenSSL文档 :
“ RAND_pseudo_bytes()
把NUM伪随机字节到buf中 。通过产生的伪随机字节序列RAND_pseudo_bytes()
如果他们具有足够的长度,但不一定是不可预测的将是唯一的。它们可用于非密码用途和某些目的的密码协议,但通常不用于密钥生成等。”
无论这些警告实际上应该使用这些方法吓唬你 - 他们所描述的弱点只是理论上的,除了可能在某些人为的情况下(如无硬件RNG后,立即启动了无盘嵌入式设备上),并且不应该在实际情况下,关注PHP在哪里一样正常部署。
其结果是,没有这些随机数产生方法将是最薄弱的环节在您的密码,这样你就可以放心地选择任何一个。 如果你感到偏执,你甚至可以同时使用。
PS。 的一个优点openssl_random_pseudo_bytes
是,它适用于Windows,太。 在另一方面, /dev/urandom
,请在Unix上,即使没有安装OpenSSL的PHP扩展。 因此,最大的可移植性,你的确应该实施都支持。
此外,经常检查你预计你确实收到许多字节; 例如,在/dev/urandom
在你的问题基于以上代码可能不返回在像Windows系统中一个空字符串/dev/urandom
不存在。