通過在 Linux 上讀取 /dev/random 來初始化密鑰是否安全?
對於一個軟體,我不希望使用者選擇弱密鑰,所以我打算從 /dev/random 中讀取所需的字節數來創建所需的密鑰。這樣做安全嗎?
是的,在密鑰只是隨機數的任何算法中,從中讀取它們
/dev/random
是安全的。但是,
/dev/random
如果核心的熵估計變為零,則會阻塞,因此使用從會話密鑰和其他類似的批量使用的隨機數播種的使用者空間 CSPRNG 通常是一個好/dev/random
主意/dev/urandom
。如果可用,更新的getrandom
界面可能更可取。當您不需要很高的隨機性時,直接使用
/dev/urandom
or也可以,因為它們相當慢(至少在 Linux < 4.8 上)。getrandom
如果
/dev/random
正常工作,是的,通過讀取密鑰來生成密鑰是安全的;相同 for/dev/urandom
,應該同樣安全且無阻塞,因此總是優於/dev/random
.然而,在實踐中,很容易讓一個埠
/dev/random
(或其底層熵源)看起來可以工作,但實際上並沒有,並且會在不同的設備上生成相同的輸出(或具有可預測相關性的輸出),尤其是在之後自啟動以來的持續時間完全相同。這是允許最近發生一些攻擊的幾個可能的根本原因之一,並且類似於允許攻擊的原因(另一個可能的原因是本土 RNG 試圖改進/dev/(u)random
,或者更糟的是不使用它)。因此,特別是在其熵提供程序及其熵提供程序的非主流實現中
/dev/random
,特別是如果使用上下文使得隨機生成很可能發生在自啟動後的短可預測時間之後,請不要完全依賴/dev/random
, 或/dev/urandom
(這通常會收集較少的實際熵)未經事先審查。更新 per otus 的評論:在上面,我正在考慮各種帶有 unix 衍生產品的埠,例如嵌入式開發板、機頂盒、網際網路盒或設備、防火牆、支付終端。在主流 PC linux 或 unix 發行版上,尤其是在使用者程式碼中,我傾向於信任
/dev/urandom
. 我對 Android 埠沒有知情意見(一般來說,也沒有對不同硬體的無數埠)。具體來說,我最擔心設備在設置後首次啟動時會自動生成其長期私鑰。