header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
掃碼下載APP

小科普:真隨機數和僞隨機數

2020-03-05 23:20
閱讀本文需 7 分鐘
总结 AI 總結
看總結 收起

原文標題:《小科普:真隨機數和僞隨機數》
原文來源: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

举报 糾錯/舉報
本平台現已全面集成Farcaster協議, 如果您已有Farcaster帳戶, 可以登錄 後發表評論
選擇文庫
新增文庫
取消
完成
新增文庫
僅自己可見
公開
保存
糾錯/舉報
提交