几年前,我写了一些C ++代码来登录AWS(亚马逊网络服务)。它当时运作良好。我暂时没有使用它,现在它不起作用。
"com.amazon.coral.service#InvalidSignatureException"
我认为我已将其缩小到散列函数。这个单元测试失败了:
TEST( aws_hash )
{
// unit test the hashing function used for AWS authentication
// sample input and expected results from Signature Version 4 Test Suite
// https://docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html
// specifically the get-vanilla-query
// note that this is step 1 of the signing process an does not involve the secret key.
// input string
std::string query =
"GET / HTTP/1.1\n"
"Host:example.amazonaws.com\n"
"X-Amz-Date:20150830T123600Z";
// calculate hash of input
SHA256 sha256;
std::string thehash = sha256( query );
// expected hash value from test suite
// ( last line of get-vanilla-query.creq )
std::string expected = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
// did we get the expected hash?
CHECK_EQUAL( expected, thehash );
}
输出:
C:\unit_test\main.cpp(47): error: Failure in aws_hash:
Expected e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
but was 509955df496ae2f4fdc25af95ccf5406099e4a2556523b7ed80f4fab21ac1869
我正在使用的散列函数的代码可以在https://github.com/JamesBremner/sha256
看到我应该注意一些变化吗?
我的单元测试有问题吗?
答案 0 :(得分:1)
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
这是空字符串的SHA-256哈希值(参见https://crypto.stackexchange.com/a/26135/25027)。
Signature V4与Signature V2完全不同。您首先使用在没有请求主体时显示的值来散列正文(HTTP请求正文,不包括标题)。
Signature V4的实际输入中没有任何部分与您的// input string
相对应。
这是您要发送的HTTP请求的示例,但它不是直接进入签名算法的内容。
canonical request structure就是这样:
CanonicalRequest =
HTTPRequestMethod + '\n' +
CanonicalURI + '\n' +
CanonicalQueryString + '\n' +
CanonicalHeaders + '\n' +
SignedHeaders + '\n' +
HexEncode(Hash(RequestPayload))
此处,在HexEncode(Hash(RequestPayload))
中,RequestPayload
仅将 引用到请求正文 - 而不是标题。如果没有正文,则使用空字符串,空字符串的哈希值是显示的值。