当前位置: 首页 > 知识库问答 >
问题:

PHP:openssl_random_pseudo_bytes()和加密安全vs极端随机性

王君墨
2023-03-14

对PHP中的openssl_random_pseudo_bytes()做了一些研究,我注意到在PHP源代码中openssl_random_pseudo_bytes()函数的实现中。OpenSSL的RAND_pseudo_bytes函数用于生成返回值,而不是RAND_bytes也可以在OpenSSL中使用。

OpenSSL对这两个功能的文档如下:

RAND_pseudo_bytes()将num伪随机字节放入buf。由RAND_Pseudo_bytes()生成的伪随机字节序列如果足够长,则是唯一的,但不一定是不可预测的。它们可以用于非加密目的和加密协议中的某些目的,但通常不用于密钥生成等。

RAND_bytes()将num加密强伪随机字节放入buf。如果PRNG的种子没有足够的随机性来确保不可预测的字节序列,则会发生错误。

我想我的问题是为什么没有RAND_bytes使用,或者为什么在PHP中没有openssl_rand_bytes()函数,如果根据OpenSSL,它更随机。

只是好奇。是速度问题吗?不够可靠?或者PRNG是问题所在(即:在大多数情况下伪代码正常工作时难以实现)?

谢谢

共有1个答案

祝高超
2023-03-14

这个选择可能是基于实用性,而不是密码的可靠性。如果使用了RAND_bytes(),该函数可能会由于可用的随机性不足而失败。PHP代码的作者无疑希望避免PHP函数失败。

我注意到,虽然openssl_random_pseudo_bytes()函数确实有一个可选的crypto_strong参数,它让调用者知道返回的字节是否真的在密码学上是强大的,在OpenSSL看来。

另一方面,可以使用外部引擎配置OpenSSL,其中一些引擎(如CHIL)使用基于硬件的随机源,用于RAND_pseudo_bytes()RAND_bytes(),如果您需要的话。

另外,在Windows上,PHP代码使用CryptGenRandom

 类似资料:
  • 尽管在阅读了许多关于的文章之后,我遇到了一个关于在Java中使用安全API的疑问。在下面的示例中。 } 谁能让我知道我在这里做的是对的吗?

  • 问题内容: PHP的函数不能提供良好的随机数。因此,我开始使用据说效果更好的产品。但是这些结果有多好?有什么方法可以再次改善它们? 我的点子: 这应该给您“完美的”随机数,不是吗? 问题答案: 伪随机数生成器(PRNG)是非常复杂的野兽。 没有真正的“完美”随机数生成器-实际上,可以通过数学函数完成的最好的操作是伪随机数-对于大多数意图和目的,它们似乎足够随机。 实际上,从PRNG返回的数字中执行

  • 问题内容: 我正在用python创建一个项目,我想创建一个加密安全的随机数,我该怎么做?我已经在线阅读了常规随机生成器生成的数字不是密码安全的信息,并且该函数返回的是我的字符串,而不是数字。 问题答案: 您可以通过将函数应用于所返回的字节来获取随机数列表,如下所示 报价文件, 返回 适合加密使用* 的随机字节字符串。 * 该函数从特定于操作系统的随机性源返回随机字节。尽管返回的数据的确切质量取决于

  • 无论是开发Web应用的开发者还是企图利用Web应用漏洞的攻击者,对于Web程序安全这个话题都给予了越来越多的关注。特别是最近CSDN密码泄露事件,更是让我们对Web安全这个话题更加重视,所有人都谈密码色变,都开始检测自己的系统是否存在漏洞。那么我们作为一名Go程序的开发者,一定也需要知道我们的应用程序随时会成为众多攻击者的目标,并提前做好防范的准备。 很多Web应用程序中的安全问题都是由于轻信了第

  • 创建随机盐。 使用SALT加密密码。 保存用户的salt和加密密码。 我想要盐的大小,算法给出作为输入。 我想要解密的原因是,我有一些为应用程序创建的配置文件和一些值是密码,我想要保存为加密的文件和解密时,我想要使用它。 谁能提供一个适当的例子或如何使用它在我自己的方式?我想实现Jasypt在文章中提到的。但没有可用的代码。

  • 问题内容: 在多个线程之间共享该类的一个实例是否有效?并特别从多个线程调用? 问题答案: 从某种意义上讲,它是线程安全的,当被多个线程使用时仍会生成随机数。 Sun / Oracle JVM实现使用同步和AtomicLong作为种子来提高线程之间的一致性。但是,文档中似乎并没有在所有平台上对此进行担保。 我不会编写要求这种保证的程序,尤其是当您无法确定调用顺序时。