openssl rand 命令在密碼學上是安全的嗎?
我想知道 openssl rand 命令是否會產生加密安全的隨機字節。例如,當需要隨機密碼或令牌時:
openssl rand -hex 32
不幸的是,手冊頁既沒有說明它是加密安全的,也沒有說明它不是。
一方面,我認為這是openssl,它的唯一目的是做密碼學。另一方面,手冊頁說明了有關讀取和寫入種子數據的內容,而不是直接查詢 CSPRNG。
所以對於最終使用者來說有點不清楚。有人知道嗎?
是的,它是加密安全的偽隨機輸出,通過從作業系統檢索安全隨機數據來播種。
它是否是隨機的取決於 OS RNG 是否是隨機的事實。這通常是普通桌面的情況,但您最好確定用於有限的嵌入式系統。如果無法檢索到真正的隨機數據 - 根據
RAND_bytes
- 然後rand
將退出並出現錯誤。補充說明:當然你依賴於實現。眾所周知,Debian 的 OpenSSL 被破壞了,因為維護者執行了一個程序來查找記憶體錯誤並禁用了所有熵源,而不是(故意)使不應該使用未初始化記憶體的屬性失敗的熵源。因此,查看安全報告並讓您的系統保持最新/長期支持非常重要。
您添加的任何隨機源都將
-rand [file][:file]*
用作額外的種子數據- 換句話說,即使您提供相同的種子,輸出也將始終是隨機的。由於 OpenSSL 提供的偽隨機生成器一般執行在主執行緒的應用程序空間中,可能比從
/dev/urandom
. 但老實說,大多數時候使用/dev/urandom
就足夠了(目前的實現也很快)。當您查看指向手冊頁的連結
RAND_bytes
時,您可以看到它是隨機的,該連結位於命令行後面rand
並從手冊頁連結到該函式(在“另見部分,但是是的”中):
RAND_bytes()
將num
加密的強偽隨機字節放入buf
. 如果 PRNG 沒有以足夠的隨機性播種以確保不可預測的字節序列,則會發生錯誤。
RAND_bytes()
可以在rand
命令的源文件中找到使用的那個rand.c
,所以是的,這確實是被呼叫的函式。