AWS Signature Version 4发生了哪些变化

时间:2018-01-03 16:18:56

标签: c++ amazon-web-services

几年前,我写了一些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

看到

我应该注意一些变化吗?

我的单元测试有问题吗?

1 个答案:

答案 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仅将 引用到请求正文 - 而不是标题。如果没有正文,则使用空字符串,空字符串的哈希值是显示的值。