Random-Number-Generator

如何從 /dev/hwrng 獲取 1 到 2048 之間的隨機數?

  • March 7, 2021

我正在(也許天真地)評估使用以下程式碼創建 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.

引用自:https://crypto.stackexchange.com/questions/88676