原文標題:《小科普:真隨機數和僞隨機數》
原文來源:bitpieteam
比特幣用戶很喜歡討論「非對稱加密」、「橢圓曲線」、「量子計算機」這類高深莫測的話題,然後再以一種非常莫名其妙的方式把幣弄丟,比如說:「隨機」。
歷史上多起各品牌的錢包用戶丟幣事件,都是因爲隨機函數存在問題。
隨機很重要,對於比特幣這種密碼學電子貨幣來說,尤其重要。可惜社區內對於隨機的討論並不多,導致很多人缺乏正確的認識,因此,我們今天就和大家聊聊隨機。
說到隨機,有兩個必須要搞清楚的概念:「真隨機數生成器」(TRNG)和僞隨機數生成器(PRNG)。
大部分計算機程序和語言中的隨機函數,都是僞隨機數生成器,它們都是由確定的算法,通過一個「種子」(比如「時間」),來產生「看起來隨機」的結果。
毫無疑問,任何人只要知道算法和種子,或者之前已經產生了的隨機數,都可能獲得接下來隨機數序列的信息。因爲它們的可預測性,在密碼學上並不安全,所以我們稱其爲「僞隨機」。這種隨機數,用來讓遊戲裏的小人跑跑路沒多大問題,如果用來生成比特幣私鑰,那可就太不安全了。
再說說真隨機數生成器,中文維基中,將「硬件隨機數生成器」(HRNG)等同於真隨機數生成器,這其實並不十分準確,嚴格意義上的真隨機可能僅存在於量子力學之中,我們當前所想要的(或者所能要的),並不是這種隨機。
我們其實想要一種不可預測的、統計意義上的、密碼學安全的隨機數,只要能做到這一點的隨機數生成器,都可以稱其爲真隨機數生成器。這種真隨機,並不一定非得是特殊設計的硬件,Linux 操作系統內核中的隨機數生成器(/dev/random),維護了一個熵池(蒐集硬件噪聲,如:鍵盤、鼠標操作、網絡信號強度變化等),使得它能夠提供最大可能的隨機數據熵,因此同樣是高品質的真隨機數生成器。
不過/dev/random 是阻塞的,也就是說,如果熵池空了,對於/dev/random 的讀操作將被掛起,直到收集到足夠的環境噪聲爲止。
因此,在開發程序時,我們應使用/dev/urandom,作爲/dev/random 的一個副本,它不會阻塞,但其輸出的熵可能會小於/dev/random。
好了,在說了這麼多之後,在我們開發比特幣應用時,應該使用何種隨機數生成器來生成私鑰呢?
答案很簡單:urandom。永遠只用 urandom。
不要使用任何第三方的隨機數解決方案,哪怕是一些高級的安全庫,所提供的聲稱「非常安全」的隨機函數。因爲它們都是用戶態的密碼學隨機數生成器,而 urandom 是內核態的隨機數生成器,內核有權訪問裸設備的熵,內核可以確保,不在應用程序間,共享相同的狀態。
歷史上,無數次隨機數失敗案例,大多出現在用戶態的隨機數生成器,而且,用戶態的隨機數生成器幾乎總是要依賴於,內核態的隨機數生成器(如果不依賴,那風險則更大),除了沒準兒能簡化您的某些開發工作,絲毫看不出任何額外的好處,反而增加了因引入第三方代碼,所可能導致的潛在安全風險。
因此,開發者在需要密碼學安全的隨機數時,應使用 urandom。
最後,有小朋友問,你們的 BITHD 硬件錢包生成的是真隨機數嗎?
這裏回答一下:當然是啦~
BITHD 的芯片是有硬件隨機數發生器的,它會通過獲取物理噪聲源來生成真隨機數,這個是不可預測,不可探測的,是真正的隨機源。
來源鏈接:weixin.qq.com
歡迎加入律動 BlockBeats 官方社群:
Telegram 訂閱群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方帳號:https://twitter.com/BlockBeatsAsia