我应该使用 urandom() 还是 openssl_random_pseudo_bytes()?

信息安全 哈希 php 随机的
2021-08-13 20:07:59

我正在用 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);
2个回答

为密码散列生成盐的正确方法是:不要自己做。使用已经正确处理的库。有关指针,请参阅@Terry 的答案。

对于您的确切问题,它恰好openssl_random_pseudo_bytes()依赖于 OpenSSL 的内部PRNG,它本身依赖于底层平台提供的内容,即dev/urandom,因此它是安全的。严格来说,您应该使用该函数的第二个参数来检查 OpenSSL 是否确实在本地平台上找到了强随机性来源(请参阅文档),但实际上,只要 OpenSSL 在类 Unix 或 Windows 上运行-像平台一样,一切都会好起来的。openssl_random_pseudo_bytes()因此,为了安全起见,您是打电话还是自己阅读并不重要/dev/urandom出于维护的原因,我更喜欢前者,它更简单(只有一个调用)和更便携(它也可以在 Windows 上工作,而阅读/dev/urandom则不行)。

openssl_random_pseudo_bytes()无论哪种方式,在or的输出上应用 SHA-1/dev/urandom都是完全没用的。好的 PRNG 已经产生了不可预测的均匀随机字节(如果你的 PRNG 不好,那你为什么要使用它?)。

注意:这并不能准确回答问题。

尽量不要推出自己的加密货币。由于您使用的是 PHP,因此很容易获得一个很棒的 bcrypt 库 - phpass,它将处理密码散列方面,包括生成盐。