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

買賣虛擬貨幣
比特幣使用者很喜歡討論“非對稱加密”、“橢圓曲線”、“量子計算機”這類高深莫測的話題,然後再以一種非常莫名其妙的方式把幣弄丟,比如說:“隨機”。之前曾爆出的 brainwallet.org 網站使用者丟幣事件,就是因為隨機函式的問題。隨機很重要,對於比特幣這種密碼學電子貨幣來說,尤其重要。

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

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

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

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

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

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

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

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

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

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

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

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;