Random-Number-Generator

openssl rand 命令在密碼學上是安全的嗎?

  • June 13, 2020

我想知道 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,所以是的,這確實是被呼叫的函式。

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