RAND
名稱
RAND - OpenSSL 亂數產生器
說明
亂數是密碼學的要角,它們用於提供不可預測性,以執行諸如金鑰產生、建立鹽值等許多任務。在軟體為基礎的產生器可以用作密碼安全偽亂數產生器 (CSPRNG) 之前,必須先以外部亂數為種子。具備特殊指令的常見硬體和現代作業系統(可能使用中斷抖動和網路封包計時等項目)的可用性,可能是種子資料的合理來源。
OpenSSL 附帶 RAND API 的預設實作,該實作基於 [NIST SP 800-90A Rev. 1] 中所述的確定性亂數位元產生器 (DRBG) 模型。預設亂數產生器會在第一次使用時自動初始化,且無需明確初始化(「植入種子」)即可完全運作。它會使用作業系統提供的受信任亂數來源自動植入和重新植入種子。
作為一般的應用程式開發人員,您不必擔心任何細節,只要使用 RAND_bytes(3) 取得亂數資料即可。話雖如此,仍有一個重要的規則必須遵守:務必檢查 RAND_bytes(3) 的錯誤回傳值,並且不要將亂數視為理所當然。雖然(重新)植入種子是自動化的,但它可能會失敗,因為沒有可用的受信任亂數來源,或受信任來源暫時無法提供足夠的亂數種子資料。在這種情況下,CSPRNG 會進入錯誤狀態,並停止提供輸出,直到它能夠透過重新植入種子來從錯誤中復原。有關重新植入種子和錯誤復原的更多詳細資訊,請參閱 EVP_RAND(7)。
對於應該保密的數值,您可以改用 RAND_priv_bytes(3)。此方法不會提供「更好的」亂數,它使用相同類型的 CSPRNG。使用專用的 CSPRNG 專門用於私密數值的用意是,它的輸出不應讓攻擊者看到(例如,用作鹽值),以盡可能少地揭露其內部狀態的資訊,而且「公開」CSPRNG 執行個體的妥協不會影響這些私密數值的機密性。
在預設實作無法滿足您的特殊需求的罕見情況下,預設 RAND 內部元件可以替換為您自己的 EVP_RAND(3) 物件。
只有在特殊情況下才需要變更預設亂數產生器,而且不建議這麼做,除非您對密碼學原理有深入的了解,並且了解變更的影響。
預設設定
預設 OpenSSL RAND 方法基於 EVP_RAND 確定性亂數位元產生器 (DRBG) 類別。DRBG 是一種特定類型的密碼安全偽亂數產生器 (CSPRNG),其說明記載於 [NIST SP 800-90A Rev. 1] 中。
另請參閱
RAND_bytes(3)、RAND_priv_bytes(3)、EVP_RAND(3)、RAND_get0_primary(3)、EVP_RAND(7)
版權
版權所有 2018-2021 The OpenSSL Project Authors。保留所有權利。
根據 Apache 許可證 2.0 版(「許可證」)授權。除非符合許可證,否則您不得使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案中取得一份副本,或至 https://www.openssl.org/source/license.html 取得。