Php AWS4签名密钥-本教程错误吗?

Php AWS4签名密钥-本教程错误吗?,php,amazon-web-services,hmac,aws-api-gateway,Php,Amazon Web Services,Hmac,Aws Api Gateway,根据本页: 此代码的结果是: $kSecret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"; $kDate = hash_hmac('sha256', "20120215", "AWS4" . $kSecret); echo "date: " . $kDate . "<br>"; $kRegion = hash_hmac('sha256', "us-east-1", $kDate); echo "region: " . $kRegio

根据本页:

此代码的结果是:

$kSecret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";

$kDate = hash_hmac('sha256', "20120215", "AWS4" . $kSecret);
echo "date: " . $kDate . "<br>";

$kRegion = hash_hmac('sha256', "us-east-1", $kDate);
echo "region: " . $kRegion . "<br>";

$kService = hash_hmac('sha256', "iam", $kRegion);
echo "service: " . $kService . "<br>";

$kSigning = hash_hmac('sha256', "aws4_request", $kService);
echo "signing: " . $kSigning . "<br>";
所以,我得到的kDate是正确的。kRegion不正确,因为我得到的值是:

a59e30f9d899c47b3dd68ea1c0ab3bb529e03a8f4ed2f54cb64af547330a22a0
我尝试使用这个网站来计算HMAC(),得到了相同的结果

我真想知道这一页是否错了。有人能解释是我的错还是AWS的错吗

多谢各位

  • 您应该了解这些值是二进制的,并以十六进制形式打印
  • 您正在以十六进制传递日期。您应该将其转换为二进制,并在调用
    哈希\u hmac
    之前传递它。或者以二进制存储,并以十六进制打印
  • 你从来没有提到你正在使用的语言。我不得不用谷歌搜索你正在使用的语言。在PHP中,可以传递:$raw\u output=true以获取二进制字符串
  • 将字符串存储为二进制,并在打印前将其转换为十六进制
  • 因为我不熟悉PHP,所以我在Python中尝试了相同的方法,输出与预期的输出匹配。看看我如何将其转换为十六进制和打印

    import hmac
    import hashlib
    from base64 import b16encode as b16
    
    def sign(key, msg):
        return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()
    
    def getSignatureKey(key, dateStamp, regionName, serviceName):
        kDate = sign(("AWS4" + key).encode("utf-8"), dateStamp)
        print b16(kDate)
        kRegion = sign(kDate, regionName)
        print b16(kRegion)
        kService = sign(kRegion, serviceName)
        print b16(kService)
        kSigning = sign(kService, "aws4_request")
        print b16(kSigning)
        return kSigning
    
    key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
    dateStamp = '20120215'
    regionName = 'us-east-1'
    serviceName = 'iam'
    
    getSignatureKey(key, dateStamp, regionName, serviceName)
    
    输出

    969FBB94FEB542B71EDE6F87FE4D5FA29C789342B0F407474670F0C2489E0A0D
    69DAA0209CD9C5FF5C8CED464A696FD4252E981430B10E3D3FD8E2F197D7A70C
    F72CFD46F26BC4643F06A11EABB6C0BA18780C19A8DA0C31ACE671265E3C87FA
    F4780E2D9F65FA895F9C67B32CE1BAF0B0D8A43505A000A1A9E090D414DB404D
    
    PHP

    string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] )
    

    请立即删除此项。不要发布您的AWS密钥。这是AWS提供的示例密钥:)哦,呸。我见过很多人张贴真正的秘密钥匙。对不起,别担心。谢谢你告诉我:-)非常感谢你的回答。很抱歉,我不得不提到我正在使用PHP。我会按照你的建议进行文本转换,找出问题所在@MeV:你能发布完整的php代码吗?我正在使用php,无法找到问题。我已经用上面的方法验证了我的代码,我觉得一切都很好。
    string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] )