本质上,我想对我在 AWS KMS (CMK) 中生成的对称密钥(特别是 HMAC)执行此“签名”机制。但显然,该示例中的 SignRequest 或
SignResponse
类仅支持非对称密钥,所以我想知道对对称密钥执行此操作的等效类是什么?我发现这个 GenerateKey API 是使用 HMAC 密钥进行签名的唯一 API 方式,但该示例未提供所有详细信息(仅具有示例请求正文)。我们实际上在哪里发送请求/我们如何进行身份验证?
总之,需要知道如何使用我的 KMS 中已有的 KMS HMAC 密钥来签署消息/生成 mac。附:我已经能够在命令行上做我想做的事情(见下文)。只需要一个 API 方式即可完成此操作。
% aws kms generate-mac --message fileb://aws-test.txt --key-id <keyId> --mac-algorithm HMAC_SHA_256
{
"Mac": "<mac>",
"MacAlgorithm": "HMAC_SHA_256",
"KeyId": "arn:aws:kms:<region>:<....>:key/<keyId>"
}
user@user-mac
% aws kms verify-mac --message fileb://aws-test.txt --key-id <keyId> --mac-algorithm HMAC_SHA_256 --mac <mac>
{
"KeyId": "arn:aws:kms:<region>:<....>:key/<keyId>",
"MacValid": true,
"MacAlgorithm": "HMAC_SHA_256"
}
user@user-mac
附注我成功使用 aws-sdk:kms 在我的 KMS 中创建并上传 HMAC 密钥。
好的,我找到答案了。实现它的方法是使用这四个类 - GenerateMacRequest、GenerateMacResponse、VerifyMacRequest 和 VerifyMacResponse。请参阅下面的示例代码。
我不知道为什么 AWS 文档会如此神秘 - 这个页面我上面链接的内容没有提及实际相应的 API 方法,而是让人们误入歧途,认为必须从头开始构建请求并提供 url 和请求参数。
// define `msgToSign`, `keyId`, `algorithm`
String algorithm = "HMAC_SHA_256";
String keyId = "<your-created-keyId>";
String msgToSign = "Hello, World!"
SdkBytes bytes = SdkBytes.fromString(msgToSign, Charset.defaultCharset());
GenerateMacRequest rq = GenerateMacRequest.builder()
.keyId(keyId)
.message(bytes)
.macAlgorithm(algorithm)
.build();
GenerateMacResponse rs = kmsClient.generateMac(rq);
String macStr = new String(Base64.encodeBase64(rs.mac().asByteArray()));
System.out.println("Base64 encoded mac: " + macStr);
VerifyMacRequest vmrq = VerifyMacRequest.builder()
.keyId(keyId)
.macAlgorithm(algorithm)
.message(bytes)
.mac(rs.mac())
.build();
VerifyMacResponse vmrs = kmsClient.verifyMac(vmrq);
System.out.println("Mac valid? : " + vmrs.macValid());