crypto#randomBytes是如何随机的?

crypto.randomBytes(20).toString('hex')

容易,所有我需要知道。

crypto.randomBytes()是如何随机的? 通常情况下, 无论您需要什


crypto.randomBytes()生成密码安全的随机数据:

crypto.randomBytes(size [,callback])

生成密码强的伪随机数据 。 size参数是一个数字,表示要生成的字节数。

这意味着随机数据足够安全以用于encryption目的。 实际上,这个函数只是 OpenSSL的RAND_bytes()函数的一个封装 。 他们的文档的这一部分指出:

RAND_bytes将获取encryption强的随机字节。 密码强的字节适合高度完整性的需求,如长期密钥生成。 如果您的生成器正在使用软件algorithm,则这些字节将是伪随机的(但密码仍然很强)。

除非你有一个硬件随机数发生器,否则这些字节将是伪随机生成的,可以从一个种子值预测出来。 种子是从特定于操作系统的源 (在类Unix系统上的/dev/urandom ,在Windows上的CryptGenRandom )生成的。 只要你的种子是相对随机的,并且不被攻击者所知,所产生的数据就会完全是随机的。

如果你喜欢,你可以执行这里描述的testing:

给定任意二进制数字序列,可以使用统计技术对其进行检查。 有各种统计testing套件,如NIST随机数生成页面提供的STS(统计testing套件)。 这个套件提供了许多不同的testing,包括:

  • 频率(Monobit)testing:检查给定序列中的0和1的比例是否近似于期望值
  • 运行testing:testing给定序列内连续相同的数字长度是否与预期一致
  • 在一个块中的最长的一个单元:确认一个序列中最长的一个单元是否是预期的

这将给你一个非常好的指示你的发电机是如何随机在你的系统上。 但请放心,它可能与真正的随机数据源几乎没有区别,所以对于几乎​​任何应用程序来说,它应该是足够随机的。