OpenSSL

密码学和SSL/TLS工具包

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 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)获得许可。除非符合许可证,否则您不得使用此文件。您可以在源代码分发版中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取副本。