文章閱讀頁通欄

隨機數關乎比特幣私鑰安全

來源: bitpiewallet 作者:
比特幣用戶很喜歡討論“非對稱加密”、“橢圓曲線”、“量子計算機”這類高深莫測的話題,然后再以一種非常莫名其妙的方式把幣弄丟,比如說:“隨......
比特幣用戶很喜歡討論“非對稱加密”、“橢圓曲線”、“量子計算機”這類高深莫測的話題,然后再以一種非常莫名其妙的方式把幣弄丟,比如說:“隨機”。

之前曾爆出的 brainwallet.org 網站用戶丟幣事件,就是因為隨機函數的問題。

隨機很重要,對于比特幣這種密碼學電子貨幣來說,尤其重要。

說到隨機,有兩個必須要搞清楚的概念:“真隨機數生成器”(TRNG)和偽隨機數生成器(PRNG)。

大部分計算機程序和語言中的隨機函數,的確是偽隨機數生成器,它們都是由確定的算法,通過一個“種子”(比如“時間”),來產生“看起來隨機”的結果。

毫無疑問,任何人只要知道算法和種子,或者之前已經產生了的隨機數,都可能獲得接下來隨機數序列的信息。因為它們的可預測性,在密碼學上并不安全,所以我們稱其為“偽隨機”。這種隨機數,用來讓游戲里的小人跑跑路沒多大問題,如果用來生成比特幣私鑰,那可就太不安全了。

再說說真隨機數生成器,中文維基中將“硬件隨機數生成器”(HRNG)等同于真隨機數 生成器,這其實并不十分準確,嚴格意義上的真隨機可能僅存在于量子力學之中,我們當前所想要的(或者所能要的),并不是這種隨機。

我們其實想要一種不可預測的、統計意義上的、密碼學安全的隨機數,只要能做到這一點的隨機數生成器,都可以稱其為真隨機數生成器。這種真隨機,并不一定非得是特殊設計的硬件,Linux操作系統內核中的隨機數生成器(/dev/random),維護了一個熵池(搜集硬件噪聲,如:鍵盤、鼠標操作、網絡信號強度變化等),使得它能夠提供最大可能的隨機數據熵,因此同樣是高品質的真隨機數生成器。

不過/dev/random是阻塞的,也就是說,如果熵池空了,對于/dev/random的讀操作將被掛起,直到收集到足夠的環境噪聲為止。

因此,在開發程序時,我們應使用/dev/urandom,作為/dev/random的一個副本,它不會阻塞,但其輸出的熵可能會小于/dev/random。

在開發比特幣應用時,應該使用何種隨機數生成器來生成私鑰呢?
答案很簡單:urandom。永遠只用urandom。

不要使用任何第三方的隨機數解決方案,哪怕是一些高級的安全庫,所提供的聲稱“非常安全”的隨機函數。因為它們都是用戶態的密碼學隨機數生成器,而urandom是內核態的隨機數生成器,內核有權訪問裸設備的熵,內核可以確保,不在應用程序間,共享相同的狀態。

歷史上,無數次隨機數失敗案例,大多出現在用戶態的隨機數生成器,而且,用戶態的隨機數生成器幾乎總是要依賴于,內核態的隨機數生成器(如果不依賴,那風險則更大),除了沒準兒能簡化您的某些開發工作,絲毫看不出任何額外的好處,反而增加了因引入第三方代碼,所可能導致的潛在安全風險。

因此,開發者在需要密碼學安全的隨機數時,應使用urandom。

關鍵詞: 隨機數  比特幣私鑰  
0/300
? 时时彩龙虎和计划app