密码#randomBytes是多么随机?

Mar*_*ens 16 random cryptography node.js

多么随机crypto.randomBytes(20).toString('hex')

这很简单,我需要知道的一切.

Aur*_*001 22

多么随机crypto.randomBytes()?通常,随意足以满足您的需要.


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

crypto.randomBytes(size [,callback])

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

这意味着随机数据足够安全,可用于加密目的.实际上,该函数只是 OpenSSL RAND_bytes()函数的包装器.这部分文档说明:

RAND_bytes将获取加密强大的随机字节.密码强字节适用于高完整性需求,例如长期密钥生成.如果您的生成器使用的是软件算法,则字节将是伪随机的(但仍然是加密强大的).

除非您有硬件随机数生成器,否则字节将从种子值可预测地伪随机生成.种子是从特定操作系统的源(/dev/urandom在类Unix系统上,CryptGenRandom在Windows上)生成的.只要您的种子相对随机且攻击者不知道,所产生的数据将显得完全随机.

如果您愿意,可以执行此处描述的测试:

给定任意二进制数字序列,可以使用统计技术检查它.有各种统计测试套件,例如可从NIST的RANDOM NUMBER GENERATION页面获得的STS(统计测试套件).该套件提供了许多不同的测试,包括:

  • 频率(单比特)测试:检查给定序列中0和1的比例是否与预期的大致相同
  • 运行测试:测试给定序列中不同长度的连续相同数字的运行次数是否符合预期
  • 块中的最长运行时间:确认序列中最长的单次运行是否与预期的一样

这样可以很好地指示您的发电机在系统上的随机性.但请放心,它可能几乎与真正的随机源无法区分,因此对于几乎任何应用来说它应该是足够随机的.