我尝试使用 Rs Digest 包为 Amazon API for Dynamodb 创建签名。 签名需要 sha256。 目前,我正在测试 R 的摘要包,看看它是否在我的输入下产生正确的输出。
根据亚马逊网站的例子,如果我的输入是:
输入:"iam"
那么我的输出应该是:
目标输出:'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
当我使用以下 R 命令时:
digest("iam", algo="sha256", serialize=FALSE)
我得到以下输出:
"d457e3a99392a03f47057f50ac1cbc5d0365131575477971bf85177a0c0fed22"
我已经尝试了各种输入组合(设置 serialize=TRUE 等(,但没有任何运气。
更新
根据 Rohit 的响应,我更新了我的 R 函数和方法,但我仍然没有得到正确的示例签名。 以下是我的步骤:
基于亚马逊计算 AWS 签名示例
现在使用以下 R 公式/脚本:
hmac(hmac("AWS4wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY","20110909
", "sha256", serialize=FALSE, raw=FALSE(,"us-east-1", "sha256", serialize=FALSE, raw=FALSE(,"iam", "sha256", serialize=FALSE, raw=FALSE(,"aws4_request", "sha256", serialize=TRUE, raw=TRUE(得到这个结果:
FE BD 15 B6 AC 8d 68 7A 93 F9 1C 9C DC 9E F8 D9 F1 79 FB A8 62 71 14 98 3A 35 0C 09 A0 EA 2E F5
与亚马逊示例中的示例签名不匹配:
152 241 216 137 254 196 244 66 26 220 82 43 171 12 225 248 46 105 41 194 98 237 21 229 169 76 144 239 209 227 176 231
我尝试更改 R 函数上的参数,但似乎与亚马逊示例不匹配。如果有人对此有一些经验,或者看起来我做错了什么,我将不胜感激。 谢谢
我认为问题出在两个地方。
首先,AWS v4 签名是使用 AWS 私有密钥作为密钥(以及其他内容(的 HMAC。HMAC 进程使用像 MD5 或 SHA256 这样的加密哈希,但它不仅仅是单个数据的哈希(在您的情况下"iam"
( - 它还需要一个"秘密"。我想你会对 R 中的 hmac 函数更感兴趣——它可以使用 SHA256 作为"算法"。
其次,如果您查看 Java 示例,了解如何计算签名和预期值:
static byte[] HmacSHA256(String data, byte[] key) throws Exception {
String algorithm="HmacSHA256";
Mac mac = Mac.getInstance(algorithm);
mac.init(new SecretKeySpec(key, algorithm));
return mac.doFinal(data.getBytes("UTF8"));
}
static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception {
byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
byte[] kDate = HmacSHA256(dateStamp, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256("aws4_request", kService);
return kSigning;
}
期望值
kSecret = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559'
kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'
kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'
您会看到kService
是使用 kRegion
计算的,而 是使用 kDate
计算的,而 本身是使用 AWS 私有密钥计算的。因此,您必须执行类似操作来计算签名。