如何通过AWS生成并一次性共享HMAC密钥与密钥值给第三方?
AWS生成并管理HMAC密钥用于第三方API签名的方案
关于选项2的误解纠正
你之前认为KMS生成的HMAC密钥值不会离开HSM,这个说法不完全正确:AWS KMS支持创建可导出的HMAC密钥,这类密钥允许你一次性获取明文密钥材料,并非所有HMAC密钥都被锁在HSM中。
选项2:AWS KMS生成可导出HMAC密钥(推荐)
这是满足你需求的最佳方式,AWS负责密钥的唯一性和随机性,同时支持获取明文密钥值,步骤如下:
- 创建可导出的HMAC密钥
调用KMS的CreateKeyAPI,指定关键参数:KeySpec: 选HMAC_256(常用)或HMAC_512KeyUsage:SIGN_VERIFYOrigin:AWS_KMS(让AWS生成密钥材料)Exportable: true(核心参数,开启后允许导出明文)- 配置
KeyPolicy,确保你的IAM角色拥有kms:GetKeyMaterial等必要权限
- 导出明文密钥材料
调用GetKeyMaterialAPI获取明文密钥值,这一步建议只执行一次,将明文安全传递给第三方后,可保留密钥在KMS中,后续签名/验证可直接调用KMS的Sign/VerifyAPI,无需再操作明文。 - 关联第三方与密钥
将KMS密钥ID与第三方标识关联存储(仅存ID,不存密钥),方便后续管理。
选项1:应用端生成+AWS Secrets Manager存储
若选择自己生成密钥,可借助AWS Secrets Manager托管存储,无需存入自有数据库,流程如下:
- 生成HMAC密钥
在应用端使用安全随机数生成器生成密钥材料(比如32字节的随机值用于HMAC-SHA256),确保生成逻辑符合密码学安全标准。 - 存储密钥到Secrets Manager
调用CreateSecretAPI,为每个第三方创建唯一的Secret(命名建议如third-party/[partner-id]/hmac-key),将密钥材料以SecretString形式存储,开启加密保护(默认用KMS密钥加密)。 - 密钥使用与管理
后续需使用密钥时,调用GetSecretValue获取明文,用完后立即销毁内存中的明文;Secrets Manager支持自动轮换密钥,若后续需要更换第三方密钥,可直接触发轮换。
方案对比
- KMS生成方案:适合追求合规性、密钥安全性的场景,AWS保障密钥质量,后续可直接用KMS托管签名/验证。
- 应用生成+Secrets Manager:更灵活,成本更低,适合对密钥生成逻辑有自定义需求的场景,但需自行确保密钥生成的安全性。
内容的提问来源于stack exchange,提问作者eVolve
相关产品推荐
相关产品推荐

