首页/安全/加密与证书速查/密钥生成与随机性来源

密钥生成与随机性来源

密钥安全依赖高质量随机源:使用操作系统 CSPRNG 或平台密钥生成接口,避免自行拼装随机数;虚拟机与嵌入式设备要确认启动时有足够熵可用。

加密与证书速查安全更新于 2026-10-13

随机性决定密钥上限

密钥再长,如果生成时的随机源可预测,整条防线就塌了。正确做法只有一条:交给操作系统的密码学安全随机数发生器(CSPRNG)或平台密钥生成接口,例如 OpenSSL 的 genpkey、HSM 内部的密钥生成命令。自己拿时间戳、进程号或普通伪随机函数拼出来的「随机」,在同一秒内可能完全重复;更隐蔽的风险来自环境本身——虚拟机镜像克隆后没有重新生成主机密钥与证书私钥,模板里那套密钥就会在成百上千台机器上重复。

基本信息

正确来源/dev/urandom、getrandom()、系统 CSPRNG、HSM 内生成
风险做法时间戳、进程号或自研伪随机函数拼凑
生成命令openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out key.pem
环境检查cat /proc/sys/kernel/random/entropy_avail 查看熵池状态
镜像场景克隆镜像后必须重新生成主机密钥与证书私钥
嵌入式设备首次启动要确认随机源就绪,再生成长期密钥

典型使用场景

  • 批量部署:从镜像派生实例后重新生成主机密钥与 TLS 私钥。
  • 设备出厂:嵌入式与 IoT 设备首次上电时生成设备密钥。
  • 容器与 CI:确认生成过程使用宿主机 CSPRNG,而不是脚本里的伪随机数。
  • 密钥恢复演练:验证重新生成后的公钥指纹确实与旧值不同。
  • 安全评审:说明密钥来源与熵源,作为合规证据。

生成与检查

生成与检查
# 使用 OpenSSL 生成密钥:交由系统 CSPRNG 提供随机性
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out key.pem
openssl genpkey -algorithm ED25519 -out ed.key
# 查看熵池可用量(较新的内核与虚拟化环境下更多是参考值)
cat /proc/sys/kernel/random/entropy_avail
# 记录公钥指纹,便于确认实例间没有重复密钥
openssl pkey -in key.pem -pubout | openssl sha256

场景与风险对照

场景常见问题正确做法
镜像克隆所有实例共用模板密钥首次启动重新生成并记录指纹
容器启动脚本自造随机数生成密钥调用 openssl 或系统 CSPRNG 接口
嵌入式首启熵源未就绪就生成密钥等待随机源可用或使用硬件随机源
批量脚本循环内重复使用同一随机种子每次调用独立获取随机性
密钥导入外部生成后手工搬运核对来源可信并校验指纹
历史上有设备因启动阶段熵不足而生成弱密钥的公开案例,尤其是首次启动即自动生成密钥的镜像与固件;上线前应连带验证并留存指纹记录。
低熵问题的发现往往滞后:批量生成的密钥若彼此相同或高度相关,只有做指纹比对或统计检查才能看出来,因此每次生成后记录公钥指纹是值得的例行动作。

易错点

  • 用普通伪随机函数替代 CSPRNG 生成密钥:随机性可预测,密钥强度形同虚设。
  • 镜像克隆后未重新生成主机密钥与证书私钥:多台机器共用同一套密钥,一处泄露全线失守。
  • 把随机数种子写死在部署脚本里:批量产出的密钥彼此相关,事后极难逐一排查。
  • 生成后不记录公钥指纹:无法确认实例之间是否重复,也没法做后续核对。

数据来源与参考

  • NIST SP 800-90A/B(随机数生成与熵源)
  • OpenSSL 官方文档(genpkey)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌