比特币用户喜欢讨论“非对称加密”、“椭圆曲线”、“量子计算机”这类高深莫测的话题,然后以一种非常莫名其妙的方式丢币,比如“随机”。
历史上很多不同品牌的钱包用户都是因为随机功能的问题丢了硬币。
随机性非常重要,尤其是对于比特币这种加密电子货币来说。可惜社区里关于随机性的讨论不多,导致很多人缺乏正确的认识。所以,今天我们就和大家聊聊随机性。
说到随机性,有两个概念必须澄清:真随机数发生器(TRNG)和伪随机数发生器(PRNG)。
计算机程序和语言中的随机函数大多是伪随机数发生器,它通过一个“种子”(比如“时间”)通过某种算法产生“看似随机”的结果。
毫无疑问,任何知道算法和种子的人,或者之前已经生成的随机数,都可以得到下一个随机数序列的信息。因为它们是可预测的,并且在密码上是不安全的,所以我们称它们为“伪随机”。这种随机数,用来让游戏里的小人跑,没问题。如果用来生成比特币私钥,太不安全了。
先说真随机数发生器。中文维基百科中,硬件随机数发生器(HRNG)相当于真随机数发生器,不太准确。严格意义上的真随机数可能只存在于量子力学中。我们目前想要(或者可以想要)的不是这种随机数。
事实上,我们想要一个不可预测、统计安全和密码安全的随机数。任何能做到这一点的随机数发生器都可以称为真随机数发生器。这种真随机不一定是专门设计的硬件。Linux操作系统内核中的随机数发生器(/dev/random)维护一个熵池(收集硬件噪音,如键盘鼠标操作、网络信号强度变化等。),使得提供最大可能的随机数据熵成为可能,所以它也是一个高质量的真随机数发生器。
但是/dev/random被阻塞,也就是说,如果熵池为空,那么对/dev/random的读取操作将被挂起,直到收集到足够的环境噪声。
所以在开发程序的时候,要用/dev/urandom作为/dev/random的副本,不会阻塞,但是它的输出熵可能小于/dev/random。
好了,说了这么多,开发比特币应用的时候应该用什么样的随机数生成器来生成私钥?
答案很简单:铀世界。一定要用铀。
不要使用任何第三方随机数解决方案,甚至一些高级安全库,提供自称“非常安全”的随机函数。因为在用户模式下都是密码随机数发生器,而urandom在内核模式下是随机数发生器,内核可以访问原始设备的熵,内核可以保证相同的状态不在应用之间共享。
历史上无数的随机数失效案例大多出现在用户模式的随机数发生器中。而且用户模式的随机数发生器几乎总是依赖于内核模式的随机数发生器(如果不依赖的话,风险更大),这可能会简化你的一些开发工作,没有任何额外的好处,反而增加了引入第三方代码带来的潜在安全风险。
因此,当开发人员需要加密安全的随机数时,他们应该使用urandom。
最后,
有小朋友问,你的BITHD硬件钱包会产生真随机数吗?
这里回答:当然是~
BITHD的芯片有一个硬件随机数发生器,可以通过获取物理噪声源来产生实随机数。这是不可预测的,不可检测的,是真正的随机源。
1.《随机数生成器 小科普:真随机数和伪随机数》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《随机数生成器 小科普:真随机数和伪随机数》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1607747.html