我应该使用urandom的或openssl_random_pseudo_bytes?(should

2019-08-05 01:49发布

我正在开发一个网站在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);

Answer 1:

为了安全起见,你是关闭使用更好的openssl_random_pseudo_bytes 。 OpenSSL的负责搜集足够的熵的为您服务良好的随机性。 /dev/urandom被设计为从不阻止,并可能被欺骗,给你不那么随机字节。

用随机字节你不需要通过SHA1来运行它们。

总之这一切,这样做:

$salt = openssl_random_pseudo_bytes(40, $cstrong);
if (! $cstrong) {
    exit('This should not happen');
}


Answer 2:

在实践中,几乎可以肯定是没有什么区别。

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不存在。



文章来源: should i use urandom or openssl_random_pseudo_bytes?
标签: php random salt