crypto.randomBytes(20).toString('hex')
的随机性如何?
这很简单,我只需要知道。
答案 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的比例是否与预期的大致相同
- 运行测试:测试给定序列中不同长度的连续相同数字的运行次数是否符合预期
- 一个区块中最长的一次运行:确认序列中最长的一次运行是否符合预期
这将为您提供关于系统中随机您的生成器的非常好的指示。但请放心,它可能几乎与真正的随机源无法区分,因此对于几乎任何应用来说都应该是随机的。