我想知道openssl rand命令是否产生加密安全的随机字节。例如,当需要随机密码或令牌时:

openssl rand -hex 32


不幸的是,手册页既未声明其密码安全性,也未声明其安全性。
<一方面,我认为这是openssl,其唯一目的是进行加密。另一方面,手册页说明了有关读取和写入种子数据的某些信息,而不是直接查询CSPRNG。

因此对于最终用户来说还不太清楚。有人知道吗?

#1 楼

是的,它是加密安全的伪随机输出,通过从操作系统检索安全随机数据来播种。

是否随机取决于OS RNG是否随机。在普通台式机上通常是这种情况,但最好确保例如有限的嵌入式系统。如果无法检索到真正的随机数据(根据RAND_bytes),则rand将退出并显示错误。

添加的注释:当然,您依赖于实现。众所周知,OpenSSL对于Debian而言是无效的,因为维护人员运行了一个程序来查找内存错误并禁用了所有熵源,而不是(故意)使不应使用未初始化内存的属性失效。因此,重要的是查看安全报告并保持系统最新/长期支持。


使用-rand [file][:file]*添加的任何随机源都用作附加种子数据。 -换句话说,即使您提供相同的种子,输出也将始终是随机的。

由于OpenSSL提供的伪随机生成器通常在主线程上的应用程序空间中运行,因此它可能比从/dev/urandom询问大量数据更快。但老实说,大多数情况下,使用/dev/urandom即可满足要求(并且当前的实现也非常快)。


当您查看指向的链接时,您会发现它是随机的。 RAND_bytes手册页,它是位于命令行rand后面并从手册页链接到的功能(在“另请参见,但是”中):


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


可以在RAND_bytes()命令rand的源文件中找到使用rand.c的情况,是的,这确实是被调用的函数。

评论


$ \ begingroup $
请说明,openssl rand使用基于时间(因此不确定)的种子吗?
$ \ endgroup $
–最好的
19年8月21日在14:04

$ \ begingroup $
当然不是,不仅仅是种子。那我为什么要澄清呢?
$ \ endgroup $
–马腾·博德威斯♦
19年8月21日在15:50

$ \ begingroup $
因此,如果您运行一次,然后擦除计算机并重新安装它,然后再次运行,它会提供相同的输出吗?还是不同的输出?
$ \ endgroup $
–最好的
19年8月22日在13:02

$ \ begingroup $
当然,它不会生成相同的流或足够大的一部分流。通常,OpenSSL的主要熵源是操作系统的随机生成器。因此,只要是随机的,您就可以确定。例如,这仍然可能是一个问题。虚拟机,可能无法直接访问硬件(HDD时序,网卡等)来检索初始熵。因此,为客户端VM安装实用程序通常是明智的。较新的Intel和AMD处理器实际上有一个熵源,尽管著名的Zen 2中的AMD版本无法在暂停和恢复后存活下来。
$ \ endgroup $
–马腾·博德威斯♦
19年8月22日在13:49

$ \ begingroup $
没有好的安全随机生成器仅依赖于当前时间。不可能是因为任何攻击者只要猜测时间就能生成相同的流。
$ \ endgroup $
–马腾·博德威斯♦
19年8月22日在13:51