2. 密码学基础

在HSM(硬件安全模块)中,密码学算法不是抽象概念,而是被固化在硬件内部、通过受控接口对外提供服务的“安全原语”。理解这些原语的原理、适用边界与组合方式,是后续开发密钥管理、加解密服务、签名验签功能的基础。本章从对称加密、非对称加密、哈希、消息认证码、数字签名到密钥管理,梳理一条从“保密”到“完整性”再到“身份可信”的完整技术链路。

一、核心原理:六类密码学原语的分工

密码学原语可以按“解决什么问题”来划分。对称加密解决数据保密性,非对称加密解决密钥分发与保密性,哈希算法解决数据完整性,消息认证码(MAC)解决完整性与共享密钥身份认证,数字签名解决完整性、身份认证与不可否认性,密钥管理则解决密钥全生命周期的安全。它们不是互相替代,而是层层组合。

对称加密使用同一把密钥进行加密和解密,典型算法有AES、SM4、3DES。其优点是速度快、适合大数据量加密;缺点是密钥分发困难,n个用户两两通信需要n(n-1)/2把密钥。非对称加密使用公钥加密、私钥解密,或私钥签名、公钥验签,典型算法有RSA、ECC、SM2。其优点是密钥分发简单、支持数字签名;缺点是运算慢,通常只用于加密会话密钥或签名摘要。

哈希算法把任意长度输入映射为固定长度摘要,具备单向性和抗碰撞性,典型算法有SHA-256、SM3。MAC在哈希基础上引入共享密钥,只有持有密钥的一方才可计算和验证,典型算法有HMAC-SHA256、CMAC。数字签名则用私钥对消息摘要签名,公钥验证,天然具备不可否认性。

密码学原语协作关系:从保密到可信 明文数据 Plaintext 对称加密 AES / SM4 / 3DES 同一密钥加解密 密文数据 Ciphertext 非对称加密 RSA / ECC / SM2 公钥加密·私钥解密 密钥管理(HSM 内部) 生成 · 存储 · 分发 · 轮换 · 销毁 · 权限控制 · 审计 哈希算法 SHA-256 / SM3 单向·抗碰撞·定长摘要 消息认证码 MAC HMAC / CMAC 共享密钥·完整性校验 数字签名 RSA-PSS / ECDSA / SM2 私钥签名·公钥验签 典型组合:对称加密保护数据 + 非对称加密保护会话密钥 + 哈希/MAC 校验完整性 + 数字签名确认身份 所有密钥与运算均在 HSM 边界内完成,明文密钥不出硬件

二、方法流程:一次安全通信的密码学编排

实际系统中,上述原语通常按“混合加密”方式组合。以客户端向服务端发送敏感数据为例,流程如下:

  1. 身份认证与密钥协商:客户端与服务端通过非对称算法(如SM2或ECDH)协商出一把临时会话密钥,或由客户端生成会话密钥后用服务端公钥加密传输。
  2. 数据加密:使用会话密钥对业务数据做对称加密,得到密文。大数据量下对称加密性能远优于非对称加密。
  3. 完整性保护:对密文计算MAC或哈希摘要,防止传输过程中被篡改。
  4. 身份确认:若需不可否认,发送方用私钥对摘要签名,接收方用公钥验签。
  5. 密钥生命周期管理:会话密钥使用后销毁,长期密钥由HSM保护并定期轮换。

关键原则:加密与完整性保护必须使用不同的密钥,避免“同一密钥既加密又认证”带来的安全风险。HSM通常通过密钥句柄和用途属性(如CKA_ENCRYPT、CKA_SIGN)强制隔离。

三、案例/场景:HSM中的密钥使用与算法选择

假设我们要在HSM中实现一个“敏感配置文件加密存储”功能。配置文件约2MB,需要保证机密性和完整性,并支持多节点部署。推荐方案是:

  • 在HSM内生成一把AES-256主密钥(KEK),标记为不可导出。
  • 每次加密文件时,在HSM内生成一把随机数据密钥(DEK),用DEK对文件做AES-GCM加密,GCM同时提供机密性和完整性。
  • 用KEK对DEK做密钥包装(Key Wrap),把包装后的DEK与密文一起存储。
  • 若需跨节点共享,用接收方公钥对DEK再加密,或通过HSM集群的密钥同步机制分发。

对应的HSM调用伪代码如下:

// 1. 生成数据密钥 DEK(HSM 内部)
C_GenerateKey(hSession, CKM_AES_KEY_GEN,
              {CKA_VALUE_LEN, 32, CKA_ENCRYPT, CKA_DECRYPT},
              &hDek);

// 2. 使用 AES-GCM 加密文件
C_EncryptInit(hSession, CKM_AES_GCM, hDek, gcmParams);
C_Encrypt(hSession, plaintext, plainLen, ciphertext, &cipherLen);

// 3. 用 KEK 包装 DEK
C_WrapKey(hSession, CKM_AES_KEY_WRAP, hKek, hDek,
          wrappedDek, &wrappedLen);

// 4. 存储:wrappedDek + iv + ciphertext + tag

该方案中,明文DEK始终不出HSM,攻击者即使拿到存储文件,也无法还原数据。若使用软件实现,DEK可能出现在内存或日志中,风险显著升高。

四、误区与复盘:常见密码学使用错误

开发中常见的误区包括:用哈希代替加密存储密码(应使用加盐慢哈希如PBKDF2、bcrypt或Argon2);用ECB模式加密结构化数据(相同明文块产生相同密文块,泄露模式);MAC验证时使用普通字符串比较(应使用恒定时间比较);把私钥导出到应用内存中做签名(应通过HSM句柄调用)。

复盘要点:密码学安全不取决于算法是否“高级”,而取决于密钥是否安全、模式是否正确、随机数是否可靠、错误处理是否泄露信息。HSM的价值正是把这些易错点收敛到硬件边界内。

五、算法与用途对照清单

原语类型 典型算法 核心用途 HSM中的关键属性
对称加密 AES、SM4、3DES 大数据量保密 CKA_ENCRYPT / CKA_DECRYPT
非对称加密 RSA、ECC、SM2 密钥分发、密钥协商 CKA_WRAP / CKA_UNWRAP
哈希算法 SHA-256、SM3 完整性摘要、口令派生 CKA_DIGEST
消息认证码 HMAC-SHA256、CMAC 完整性与共享密钥认证 CKA_SIGN / CKA_VERIFY
数字签名 RSA-PSS、ECDSA、SM2 身份认证、不可否认 CKA_SIGN / CKA_VERIFY
密钥管理 Key Wrap、KDF、TRNG 密钥生成、保护、轮换 CKA_EXTRACTABLE=false