如何從 /dev/hwrng 獲取 1 到 2048 之間的隨機數?
我正在(也許天真地)評估使用以下程式碼創建 BIP39 種子片語(在只讀和離線 Raspberry Pi 上)的安全注意事項。
顯然,使用
jot -r 1 1 2048
並不理想,我想/dev/hwrng
在 Raspberry Pi 硬體上利用 HRNG ( )。printf "%s\n" "Create random 24-word BIP39 seed phrase…" seed=() for i in $(seq 1 24); do seed+=($(sed "$(jot -r 1 1 2048)q;d" "/path/to/bip39.txt")) done echo ${seed[@]}
$ cat bip39.txt | head abandon ability able about above absent absorb abstract absurd abuse
**編輯:**鑑於 BIP39 種子使用最後一個單詞作為校驗和,這種方法不起作用(參見規範)。
有不同的版本
jot
,它們使用不同的隨機源。Debian 手冊頁指出:隨機數通過 獲得
random(3)
。s 根據一天中的時間預設為種子
random
不是加密安全的。文件中沒有明確提到這一點,因此可以很好地猜測它不是¹。即使是這樣,種子是一天中的時間是非常可預測的。因此jot
,Debian 根本不適合生成密鑰或其他任何需要安全的東西。OpenBSD 手冊頁指出:
隨機數通過 獲得
arc4random(3)
。歷史版本的 jot 使用 s 作為隨機數生成器的種子。這不再受支持。
arc4random
在 OpenBSD 上是安全的,如手冊頁中所述²。因此,在 OpenBSD 上,您的腳本會安全地生成一個密碼片語,其中 $ 24 \log_2(n) $ 熵位在哪裡 $ n $ 是單詞列表的長度(假設單詞列表沒有重複項)。如果您有 GNU 實用程序,請使用
shuf
. 可以指示它使用安全隨機性:
--random-source=file
用作隨機數據的來源,用於file
確定要生成的排列。請參閱隨機來源。預設情況下,這些命令使用由少量熵初始化的內部偽隨機生成器,但可以通過
--random-source=file
選項指示使用外部源。(…) 可用資源集取決於您的作業系統。在 Linux 上,除了在沒有硬體隨機生成器的新安裝系統上之外
/dev/urandom
是安全的。由於您的平台具有硬體隨機生成器,因此您無需擔心系統隨機生成器的初始播種。所以使用 GNU coreutils,你的腳本可以是
shuf --random-source=/dev/urandom -r -n 24 <bip39.txt
¹我證實了這個猜測。
²以前用過RC4,現在壞了。輸出是有偏差的,這會降低生成密鑰的熵,但不足以破壞它。無論如何,OpenBSD 切換到不同的算法(目前是 ChaCha20),所以是安全的。其他現代 BSD 變體也已轉向安全,但要注意舊版本的 FreeBSD 和 NetBSD 是不安全的。
arc4random``arc4random``arc4random
.