2. 密码学基础回顾
在 PSA Crypto 密码服务集成工程中,所有安全能力最终都落在几类基础密码原语上。理解它们的原理、边界与组合方式,是后续调用 PSA API、配置密钥属性、设计安全通道的前提。本章不追求数学推导,而是从工程视角梳理六类核心机制:对称加密、非对称加密、哈希、消息认证码、数字签名与密钥交换,并说明它们在 PSA 架构中的典型映射。
一、核心原理:六类原语的分工
密码学原语可以按“是否使用密钥”“密钥是否相同”“是否可逆”三个维度区分。对称加密使用同一密钥完成加密与解密,速度快、适合大数据量;非对称加密使用公私钥对,解决密钥分发与身份绑定问题,但性能较低;哈希函数无密钥、单向、定长输出,用于完整性校验与指纹生成;消息认证码(MAC)在哈希或分组密码基础上加入共享密钥,同时提供完整性与来源认证;数字签名用私钥签名、公钥验证,提供不可否认性;密钥交换则让双方在不安全信道上协商出共享秘密。
二、方法流程:从原语到 PSA 调用
在 PSA Crypto 中,使用任一原语都遵循“导入/生成密钥 → 设置策略 → 执行操作 → 销毁密钥”的生命周期。以 AES-GCM 对称加密为例,典型流程如下:
/* 1. 生成或导入密钥 */
psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
psa_set_key_bits(&attr, 256);
psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT);
psa_set_key_algorithm(&attr, PSA_ALG_GCM);
psa_key_id_t key_id;
psa_generate_key(&attr, &key_id);
/* 2. 加密:一次性接口 */
uint8_t ciphertext[256];
size_t ciphertext_len;
psa_cipher_encrypt(key_id, PSA_ALG_GCM,
plaintext, plaintext_len,
ciphertext, sizeof(ciphertext), &ciphertext_len);
/* 3. 解密并验证标签 */
psa_cipher_decrypt(key_id, PSA_ALG_GCM,
ciphertext, ciphertext_len,
output, sizeof(output), &output_len);
/* 4. 销毁密钥 */
psa_destroy_key(key_id);
哈希与 MAC 的调用模式类似,但哈希不需要密钥,MAC 需要设置 PSA_KEY_TYPE_HMAC 并指定算法 PSA_ALG_HMAC(PSA_ALG_SHA_256)。数字签名则使用 psa_sign_hash 与 psa_verify_hash,密钥类型为 ECC 或 RSA 密钥对。密钥交换使用 psa_raw_key_agreement,输出共享秘密后通常再经过 HKDF 派生会话密钥。
三、案例场景:TLS 1.3 握手如何组合这些原语
以一次嵌入式设备与云端的 TLS 1.3 握手为例:客户端与服务器先通过 ECDH 交换公钥,各自计算出相同的共享秘密;随后用 HKDF 从共享秘密派生出握手密钥与应用流量密钥;握手消息用 ECDSA 签名验证服务器身份,用 SHA-256 计算握手 transcript 哈希;应用数据阶段使用 AES-128-GCM 同时完成加密与完整性保护。整个过程在 PSA Crypto 中体现为多次 psa_key_derivation、psa_sign_hash、psa_cipher_encrypt 调用,密钥 ID 与策略由 PSA 密钥库统一管理。
四、误区与复盘
| 常见误区 | 问题本质 | 正确做法 |
|---|---|---|
| 用哈希代替 MAC 做完整性校验 | 哈希无密钥,攻击者可同时篡改数据与摘要 | 使用 HMAC 或 CMAC,密钥由 PSA 密钥库保护 |
| 用非对称加密直接加密大文件 | 性能极低,且受明文长度限制 | 用非对称加密保护对称密钥,再用对称加密保护数据 |
| ECDH 共享秘密直接当会话密钥 | 共享秘密并非均匀随机,且缺少上下文绑定 | 经 HKDF 派生,并绑定 transcript 哈希与随机数 |
| 签名与加密使用同一密钥对 | 密钥用途混用,违反最小权限原则 | PSA 中通过 usage flags 严格区分 SIGN 与 ENCRYPT |
| 忽略 IV/Nonce 唯一性 | GCM 下重复 Nonce 会导致密钥流复用,严重泄露明文 | 每次加密使用唯一 Nonce,推荐随机 96 位或计数器 |