随机数生成
概述
随机 API 子系统同时提供密码学安全和非密码学安全的随机数生成 API。使用哪种随机 API 取决于随机数的密码学要求。如果只需要非密码学随机值,非密码学 API 返回随机值的速度要快得多。
将
sys_rand_get()及相关函数用于非密码学用途,例如随机化延时、打乱数据或通用随机化。这些函数速度更快,但不适合用于安全应用。将
sys_csrand_get()用于密码学用途,例如生成加密密钥、nonce、初始化向量,或任何必须对攻击者不可预测的数据。
警告
切勿将非密码学随机函数(sys_rand_get()、sys_rand8_get()、sys_rand16_get()、sys_rand32_get()、sys_rand64_get())用于安全敏感操作。这些函数不提供密码学安全的随机数。
API 用法
非密码学安全随机数
以下函数提供非密码学安全的随机数:
sys_rand_get()- 用随机字节填充缓冲区sys_rand8_get()- 获取一个随机 8 位值sys_rand16_get()- 获取一个随机 16 位值sys_rand32_get()- 获取一个随机 32 位值sys_rand64_get()- 获取一个随机 64 位值
用法示例:
#include <zephyr/random/random.h>
void example_random_usage(void)
{
uint8_t buffer[16];
uint32_t random_value;
/* Fill buffer with random bytes */
sys_rand_get(buffer, sizeof(buffer));
/* Get a single random 32-bit value */
random_value = sys_rand32_get();
}
密码学安全随机数
对于密码学用途,请使用 sys_csrand_get():
#include <zephyr/random/random.h>
int generate_encryption_key(uint8_t *key, size_t key_len)
{
int ret;
ret = sys_csrand_get(key, key_len);
if (ret != 0) {
/* Handle error - entropy source may have failed */
return ret;
}
return 0;
}
备注
sys_csrand_get() 成功时返回 0,如果熵源失败则返回 -EIO。生成密码学材料时,务必检查返回值。
Kconfig 选项
所有配置选项均可在 subsys/random/Kconfig 中找到。
通用选项
CONFIG_TEST_RANDOM_GENERATOR用于测试时,此选项允许使用非随机数生成器,并允许随机数 API 返回并非真正随机的值。
警告
此选项仅用于在不具备硬件熵源支持的平台上进行测试。启用此选项后生成的随机数可预测,不适合任何安全敏感用途。
非密码学随机数生成器选择
CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR直接使用硬件熵驱动生成随机数。这样可以提供高质量的随机数,但可能比伪随机方案更慢。当硬件熵源的性能足以满足应用需求时,请选择此选项。
CONFIG_XOSHIRO_RANDOM_GENERATOR使用由硬件熵源播种的 Xoshiro128++ 伪随机数生成器。这是一种快速的通用 PRNG,具有 128 位状态,可通过所有标准随机性测试。
对于大多数需要快速非密码学随机数的应用,这是推荐选择。
CONFIG_TIMER_RANDOM_GENERATOR使用系统定时器生成伪随机数。此生成器产生的值可预测,在不具备硬件熵源支持的平台上 仅用于测试。
密码学安全随机数生成器选择
CSPRNG_GENERATOR_CHOICE Kconfig 选择项用于选择密码学安全随机数生成的来源。
要在开发板或 SoC 配置文件中覆盖默认值:
choice CSPRNG_GENERATOR_CHOICE
default PSA_CSPRNG_GENERATOR
endchoice
可用的生成器:
CONFIG_HARDWARE_DEVICE_CS_GENERATOR直接使用硬件熵驱动作为密码学安全随机数的来源。当硬件随机数生成器已通过密码学用途的认证或验证时,请选择此项。
CONFIG_PSA_CSPRNG_GENERATOR启用使用 PSA Crypto API 的密码学安全随机数生成器。此 CSPRNG 实现利用底层 PSA Crypto 库的安全随机数生成能力,在硬件熵源可用时可能会使用这些熵源。PSA CSPRNG 提供适合安全敏感应用的密码学安全随机数。
CONFIG_TEST_CSPRNG_GENERATOR将对
sys_csrand_get()的调用路由到sys_rand_get()。这样可以在不具备硬件熵源支持的平台上测试需要 CSPRNG 的库。要求启用
CONFIG_TEST_RANDOM_GENERATOR。警告
此选项 不提供密码学安全性。仅用于测试。
Devicetree 配置
随机数子系统使用 zephyr,entropy chosen 节点来标识硬件熵设备:
/ {
chosen {
zephyr,entropy = &rng;
};
};
如果平台具有硬件随机数生成器,请确保开发板的 Devicetree 正确指定此 chosen 节点。