我一直在閱讀有關/dev/urandom
,據我所知,/dev/random
通過利用網絡數據包計時等幾個事件來創建加密隨機數。但是,我是否明白/dev/urandom
使用PRNG,使用PRNG號碼從/dev/random
?或者只要有零星 - 只要使用/dev/random
- 當它們耗盡時,它會回落到一些PRNG上,種子從哪裏收集?我瞭解/ dev/urandom嗎?
回答
從urandom
手冊頁:
隨機數發生器收集來自設備驅動程序 和其他來源 環境噪聲成 熵池。發生器還保持熵池中噪聲位數的估計值 。 從這個熵池中創建隨機數 。
讀取時,/ dev /隨機設備 將只返回熵池中噪聲 的估計位數 內的隨機字節。/dev/random 應該適合用於需要 等非常高質量的隨機性,例如 作爲一次性鍵盤或鍵 一代。 當熵池 爲空時,從/ dev/random中讀取數據塊 數據塊,直到收集到其他環境 噪聲。
從/ dev/urandom設備讀取不會阻止等待更多 熵。因此,如果在熵池 池中存在不足的熵,則返回的值爲 理論上容易受到驅動程序使用的算法 的密碼攻擊。關於 如何做到這一點的知識在 當前未分類文獻中不可用,但 在理論上可能存在此類 攻擊。如果這是您應用程序中的 問題,請改爲使用 /dev/random。
都使用PRNG,雖然使用環境數據和熵池使得破解PRNG的天文數字難度更大,如果不收集完全相同的環境數據,也是不可能的。作爲一個經驗法則,沒有從量子事件中收集數據的專門昂貴的硬件,沒有真正的隨機數發生器(即產生真正不可預測的數字的RNG);儘管爲了加密的目的,/ dev/random或/ dev/urandom就足夠了(所使用的方法是用於CPRNG,密碼僞隨機數發生器)。
熵池和阻塞/ dev/random的讀取被用作安全防護以確保不可能預測隨機數;例如,如果攻擊者用盡了系統的熵池,儘管對於今天的技術來說可能性不大,但他可以預測長時間沒有被重新調用的/ dev/urandom的輸出(儘管這也需要攻擊者用盡系統收集更多熵的能力,這也是天文數字不可思議的)。
實際上你在實際中需要的是FreeBSD的/dev/urandom
提供的內容:它將從/dev/random
讀取足夠長度的初始種子,然後使用PRNG。因此,它最初可能會阻塞(僅在系統啓動後),但一旦收集到足夠的熵,它就不會阻塞。這提供了大多數加密協議所需的隨機性級別,而不是過度阻塞。
Linux的/dev/urandom
是類似的,但它永遠不會阻塞,因此如果在啓動後立即使用,則可能會返回低質量的隨機性。另一方面,/dev/random
可能在啓動時間後甚至會阻塞,這也是一個問題。我經常看到服務器神祕地失速,因爲一些軟件堅持使用/dev/random
,而無鍵盤服務器沒有得到足夠的熵。
通常的Linux發行版在關機時保存從/dev/urandom
獲得的隨機種子,並在下一次啓動時將其注入,從而保證/dev/urandom
提供的隨機的質量。只有在操作系統安裝過程中,密碼質量纔會成爲問題,通常不是因爲安裝涉及與執行安裝的人進行多次交互,從而產生大量的熵。總之,在Linux和FreeBSD下,你應該使用/dev/urandom
,而不是/dev/random
。
報價here
/dev/random
熵池耗盡後,將阻止。它將保持阻塞狀態,直到從可用的熵源收集到額外的數據。這可能會減慢隨機數據的產生。
/dev/urandom
不會阻塞。相反,它會重用內部池來產生更多的僞隨機比特。
- 你只是想對某種測試的隨機數據大文件:
/dev/urandom
時,最好使用。
dd
命令通過將數據替換爲隨機數據來擦除磁盤上的數據。/dev/random
來代替。/dev/random
很可能是更好的選擇時:
- 隨機性是加密的應用程序中的安全至關重要 - 一次性墊,密鑰生成。
- 1. 我瞭解嗎?
- 2. 我瞭解os.walk嗎?
- 3. 我誤解了聯結嗎?
- 4. 我瞭解MsmqPoisonMessageException錯誤嗎?
- 5. 我誤解'min'了嗎?
- 6. 有人可以幫助我瞭解我做錯了什麼嗎?
- 7. 我解釋這個僞碼錯了嗎?
- 8. armadillo C++ lu分解:我做錯了嗎?
- 9. 我瞭解@ModelAttribute的權利嗎?
- 10. 我誤解了assert()的用法嗎?
- 11. 變步時間,我誤解了嗎?
- 12. Python - 我需要了解舊式類嗎?
- 13. 我誤解了這個僞代碼嗎?
- 14. jshint瞭解Angular嗎?
- 15. 瞭解自我。[]
- 16. 我瘋了嗎?
- 17. 爲了學習Ruby on Rails,我需要了解Ruby嗎?
- 18. ,我解決不了
- 19. JSON解析錯了嗎?
- 20. iphone開發解釋了嗎?
- 21. 我炒了我的A2嗎?
- 22. 我誤解了PetaPoco.IgnoreAttribute?
- 23. 我想了解crontabs
- 24. 我誤解了reloadRowsAtIndexPaths:
- 25. ,我解決不了
- 26. 瞭解我的AlarmManager邏輯
- 27. Android SQLiteException:我瞎了嗎?
- 28. 我的殼破了嗎?
- 29. AlarmManager - 我做對了嗎?
- 30. 我升級了cabal-install嗎?
我也是我的一個疑問..nice信息。謝謝。 – jyz 2010-09-11 14:29:16
@Lie,那麼OS在哪裏存儲'/ dev/random'位?它們存儲的位數有限制嗎? – Pacerier 2014-12-12 10:05:27
@Pacerier,random.c手冊頁和相應的源代碼很好地評論和相當有趣:http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/char/random 。c – ijustlovemath 2016-09-22 00:51:51