售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
说到随机性,有两个必须澄清的概念:“真随机数发生器”(NG)和伪随机数发生器(PRNG)。
计算机程序和语言中的大多数随机函数确实是伪随机数生成器,它们都是由某种算法通过“种子”(例如“时间”)确定的,以产生“看起来随机”的结果。
毫无疑问,任何知道算法和种子的人,或之前生成的随机数,都可能得到下一个随机数序列的信息。由于它们的可预测性,它们不具有加密安全性,因此我们将其称为“伪随机”。这种随机数用于使游戏中的小人物运行没有太大问题。如果它用于生成比特币私钥,则太不安全了。
我们来谈谈真正的随机数生成器。中文维基将“硬件随机数生成器”(HRNG)与真正的随机数生成器等同起来。这不是很准确。严格意义上的真正随机性可能只存在于量子力学中。我们想要的(或我们想要的)不是随机的。
我们实际上想要一个不可预测的,具有统计意义的,加密安全的随机数。可以执行此操作的任何随机数生成器都可以称为真随机数生成器。这种随机性不一定是专门设计的硬件。 Linux操作系统内核中的随机数生成器(/dev/random)维护一个熵池(收集硬件噪声,如键盘,鼠标操作,网络)。信号强度变化等,以便它可以提供最大可能的随机数据熵,因此它也是一个高质量的真随机数发生器。
但是,/dev/random被阻止,也就是说,如果熵池为空,则将暂停对/dev/random的读取,直到收集到足够的环境噪声。
因此,在开发程序时,我们应该使用/dev/urandom作为/dev/random的副本,它不会阻塞,但是它的输出熵可能小于/dev/random。
在开发比特币应用程序时,我应该使用什么样的随机数生成器来生成私钥?
答案很简单:urandom。始终只使用urandom。
不要使用任何提供“非常安全”随机功能的第三方随机数解决方案,甚至是一些高级安全库。因为它们是用户模式加密随机数生成器,并且urandom是内核状态随机数生成器,所以内核可以访问原始设备的熵,并且内核可以确保应用程序之间不共享相同的状态。
从历史上看,无数随机数失败案例主要出现在用户状态随机数生成器中,而用户状态随机数生成器几乎总是依赖于内核状态随机数生成器(如果不依赖,那么风险甚至更大。简化了一些开发工作,您没有看到任何额外的好处。相反,它会增加引入第三方代码可能带来的安全风险。
因此,开发人员在需要加密安全随机数时应使用urandom。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!