密码#randomBytes是多么随机?

时间:2017-03-26 19:20:56

标签: node.js random cryptography

crypto.randomBytes(20).toString('hex')的随机性如何?

这很简单,我只需要知道。

1 个答案:

答案 0 :(得分:17)

crypto.randomBytes()的随机性如何?通常,足够随意,无论您需要什么目的

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

  

crypto.randomBytes(size [,callback])

     

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

这意味着随机数据足够安全,可用于加密目的。实际上,围绕OpenSSL的just a wrapper函数,函数是RAND_bytes()This part of their documentation州:

  

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

除非您有硬件随机数生成器,否则字节将从种子值可预测地生成伪随机。种子是从类似Unix的系统上的OS-specific source/dev/urandom生成的,在Windows上是CryptGenRandom。只要您的种子相对随机且攻击者不知道,所产生的数据将完全随机。

如果您愿意,可以执行here所述的测试:

  

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

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

这将为您提供关于系统中随机您的生成器的非常好的指示。但请放心,它可能几乎与真正的随机源无法区分,因此对于几乎任何应用来说都应该是随机的。