密钥生成算法:对称、非对称与随机数生成器

密钥生成,说白了就是HSM里最核心的“产粮”环节。你想想,整个密钥生命周期管理,从诞生到销毁,如果种子本身就有问题,后面全是白搭。我干了这么多年,见过太多因为密钥生成不规范导致整个项目返工的案例。

今天咱们就重点聊聊三种密钥生成方式:对称密钥、非对称密钥,以及它们共同的“爹”——随机数生成器。

对称密钥的生成

对称密钥,就是加密和解密用同一把钥匙。它在HSM里生成得最频繁,也最容易忽视细节。

核心原则:对称密钥必须具有足够的熵,并且直接由硬件随机数生成器(TRNG)产生,绝不能依赖软件伪随机数。

我个人习惯把对称密钥生成分为三个步骤:

  1. 熵源采集:HSM内部的TRNG从物理噪声源(比如半导体热噪声、振荡器抖动)中提取原始随机比特。我曾经遇到过一台设备,因为散热设计有问题,噪声源的熵值在高温下急剧下降——嗯,这属于硬件层面的坑,后面再细讲。
  2. 后处理与去偏:原始随机比特通常存在偏差。需要用SHA-256或类似算法进行“萃取”,消除潜在的统计偏差。这一步也叫“熵蒸馏”。
  3. 密钥封装:将处理后的随机字节按算法要求组装成密钥结构。比如AES-256就需要恰好32字节。

不同算法的密钥长度差异很大,我简单整理了一个表:

算法类型 算法名称 密钥长度(位) HSM生成方式
对称分组 AES 128, 192, 256 TRNG直接生成,硬件加速
对称流 ChaCha20 256 TRNG + 软件包装
对称分组 SM4 128 TRNG直接生成,国密支持
对称分组 3DES 168(有效) TRNG,建议逐步淘汰

我的习惯:只要HSM支持,我永远选AES-256。性能损失微乎其微,但安全边际高得多。千万别为了省几微秒去用128位——等密钥泄露了再后悔就晚了。

非对称密钥对的生成

非对称密钥生成就复杂多了。私钥和公钥不是简单的随机字节,它们之间必须满足数学关系。这也是HSM最能体现价值的地方——私钥从生成那一刻起,就永远不离开硬件边界。

咱们来看看常见的几种:

RSA密钥对

RSA生成的核心是找两个大素数。流程大概是:先由TRNG产生候选随机数,再用米勒-拉宾素性测试反复验证。我记得有一次做性能测试,2048位RSA密钥生成平均要6秒,旁边一个同事等了半天以为HSM死机了……

生成的私钥结构包含:n(模数)、d(私钥指数)、p、q(两个素数)等。公钥只需要n和e(公钥指数)。

ECC密钥对

椭圆曲线密钥生成快得多。只要在曲线上选一个基点G,用TRNG生成一个随机数k作为私钥,公钥就是k * G,也就是标量乘法。整个过程几乎瞬间完成。

避坑指南:我曾经遇到客户把RSA密钥当ECC密钥用,在密钥提取阶段直接报错。不同算法的密钥结构完全不同,HSM在生成时就已经绑定了算法标识,千万别想着“通用密钥”——没有这回事。

对比一下两者生成时的差异:

维度 RSA ECC
生成速度 慢(秒级) 极快(毫秒级)
核心操作 大素数查找与素性测试 随机数 + 标量乘法
私钥生成位置 始终在HSM安全域内 始终在HSM安全域内
典型安全强度 2048位≈112位安全级 256位≈128位安全级
HSM资源消耗 高(CPU密集) 低

随机数生成器(RNG)——所有密钥的起点

再好的算法,如果随机数生成器有问题,密钥就是纸糊的。我见过最惨的一个案例:某知名品牌的HSM因为TRNG芯片的熵源抽取电路设计缺陷,导致生成的数有周期性偏差。结果呢?私钥被恢复出来,整个密钥体系都得重建。

HSM里通常有三级随机数体系:

  1. TRNG(真随机数生成器):硬件级别,从物理噪声提取。这是根,不可预测。
  2. DRBG(确定性随机数生成器):比如CTR_DRBG(基于AES)、Hash_DRBG(基于SHA-256)。它用TRNG的输出来做种子,然后快速产生大量伪随机数。
  3. NIST SP 800-90A/B/C合规:行业标准。认证过的HSM,其RNG必须通过这套标准的测试。

DRBG虽然叫“伪随机”,但安全强度经过数学证明,只要种子不泄露,输出序列和真随机无法区分。HSM在密钥生成时,通常用DRBG输出,因为它速度更快,且支持“重新播种”来保证前向安全。

下面这张图展示了密钥生成的完整脉络:

密钥生成算法体系结构 物理熵源 (TRNG) DRBG (CTR_DRBG / Hash_DRBG) 对称密钥生成 (AES / SM4 / ChaCha20) 非对称密钥对生成 (RSA / ECC) 直接输出 密钥包装 CRC / PKI 证书签发 密钥交换 所有密钥必须从HSM安全域内生成 私钥永不出HSM明文;公钥可提取但需签名保护 符合 NIST SP 800-133 / FIPS 140-3 标准

密钥生成时的关键检查项

生成完了不是就完事了。我每次调试HSM密钥生成流程时,都会过一遍下面这个清单:

  • 熵源健康检查:TRNG的健康状态寄存器是否正常?有没有触发“熵源枯竭”告警?
  • 是否符合算法标准:密钥长度、结构、参数是否严格遵循PKCS#1(RSA)、SEC1(ECC)或NIST SP 800-133?
  • 是否在安全边界内完成:密钥材料在生成过程中,有没有以明文形式出现在主机内存或网络报文中?HSM必须全程保护。
  • 备份与恢复能力:生成的密钥对是否立即做了加密备份(比如用主密钥WRAP)?否则一旦HSM故障,密钥就丢了。

千万注意:有些HSM在出厂时带有测试密钥。正式上线前,必须擦除这些测试密钥并重新生成。我曾经发现某厂商的设备默认带了一套RSA 1024位的演示密钥对,直接部署到生产环境——等于给攻击者留了一扇后门。

好了,密钥生成这块儿大概就是这些。说白了就是:用靠谱的熵源,在硬件安全边界内,严格按照算法标准办事。流程规范了,后面密钥的使用、轮换、归档才能顺起来。