比特币用户喜欢讨论诸如“非对称加密”,“椭圆曲线”和“量子计算机”之类的不可预测的话题,然后以一种非常莫名其妙的方式(例如“随机”)丢失他们的硬币。 brainwallet.org网站用户先前丢失硬币的事件是由于随机功能的问题所致。随机性非常重要,尤其是对于加密电子货币,例如比特币。当涉及随机性时,必须澄清两个概念:“真实随机数生成器”(True Random Number Generator)。 (TRNG)和伪随机数生成器(PRNG)。计算机程序和语言中大多数随机函数的确是伪随机数生成器。它们全部由某种算法通过“种子”生成。 (例如“时间”)产生“看似随机的”。结果。毫无疑问,任何知道算法和种子或之前已生成的随机数的人都可以获取下一个随机数序列的信息。由于它们的可预测性和不安全的密码学,我们称它们为“伪随机”。这种随机数用于使小人在游戏中不断运行。如果用于生成比特币私钥,则它太不安全了。让我们谈谈真正的随机数生成器。中文维基将“硬件随机数生成器”(HRNG)等同于真正的随机数生成器。这不是很准确。从严格意义上讲,真正的随机性可能仅存在于量子力学中。在其中,我们当前想要的(或我们想要的)不是随机的。我们实际上需要一个不可预测的,统计上安全的,密码安全的随机数。可以执行此操作的任何随机数生成器都可以称为真正的随机数生成器。这种真正的随机性不一定是专门设计的硬件。 Linux操作系统内核中的随机数生成器(/ dev / random)维护一个熵池(收集硬件噪声,例如键盘,鼠标操作,网络信号强度变化等),以便它可以提供最大可能的随机数数据熵,因此它也是高质量的真实随机数生成器。但是,/ dev / random正在阻止,也就是说,如果熵池为空,则将暂停/ dev / random的读取操作,直到收集到足够的环境噪声为止。因此,在开发程序时,应该使用/ dev / urandom作为/ dev / random的副本,它不会阻塞,但其输出熵可能小于/ dev / random。在开发比特币应用程序时,应使用哪种随机数生成器来生成私钥?答案很简单:urandom。一律只使用urandom。请勿使用任何第三方随机数解决方案,即使是某些高级安全性库,它们也提供声称“非常安全”的随机函数。因为它们都是用户模式的密码随机数生成器,而urandom是内核的模式随机数生成器,所以内核有权访问裸设备的熵,并且内核可以确保彼此之间不共享相同的状态。应用程序。历史上,无数的随机数失败案例大多出现在用户模式随机数生成器中。而且,用户模式随机数生成器几乎总是依赖于内核模式随机数生成器(如果不依赖,则风险甚至更大),除了它可以简化您的某些开发工作之外,您看不到任何根本没有其他好处,但是它增加了可能由于引入第三方代码而引起的潜在安全风险。因此,开发人员在需要加密安全的随机数时应使用urandom。