AWS HTTP Post示例的签名密钥应该是什么?

时间:2018-11-28 00:55:23

标签: c# http-post aws-sdk

我正在尝试使用“示例:使用HTTP POST(使用AWS Signature版本4)的基于浏览器的上载”页面中的值浏览示例代码,但是无法获得页面上发布的相同签名值。

该页面未显示签名密钥的值。有人知道它应该是什么吗?谢谢。

namespace TestAWSSignature
{
    class Program
    {
    // Values from aws example page.
    const string aKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
    const string anID = "AKIAIOSFODNN7EXAMPLE";
    const string aRegion = "us-east-1";
    const string aService = "s3";
    const string aBucket = "sigv4examplebucket";
    const string HMACSHA256 = "HMACSHA256";
    const string aDate = "20151229";

    const string SCHEME = "AWS4";
    const string ALGORITHM = "HMAC-SHA256";
    const string TERMINATOR = "aws4_request";

    static void Main(string[] args)
    {
        // Initial to value from aws example page.
        string base64PolicyString = "eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9";
        byte[] policyStringBytes = Convert.FromBase64String(base64PolicyString);

        // compute the signing key
        KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(HMACSHA256);
        kha.Key = DeriveSigningKey(HMACSHA256, aKey, aRegion, aDate, aService);

        Console.WriteLine(String.Format("Signing Key: {0}.\n", System.Convert.ToBase64String(kha.Key)));
        // SigningKey value is: y87x6+rvyCzOZTC58KmuWYhGBl9cW64GdL1evEulLSg=
        // Is this the correct value?

        // Compute the signature.
        byte[] signature = kha.ComputeHash(policyStringBytes);
        string signatureString = ToHexString(signature, true);

        Console.WriteLine(String.Format("Signature: {0}.\n", signatureString));
        // The computed signature value is:
        // 00e98ae3199cdbfeba701f9efa66510f23f0295ab6d6f4d14202f8ef2d11956c
        // But according to the aws example page it should be:
        // 8afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e
        Console.WriteLine("Done.");
    }

    // Functions below are straight from AWSSignatureV4-S3-Sample code.
    /// Compute and return the multi-stage signing key for the request.
    static byte[] DeriveSigningKey(string algorithm, string awsSecretAccessKey, string region, string date, string service)
    {
        const string ksecretPrefix = SCHEME;
        char[] ksecret = null;

        ksecret = (ksecretPrefix + awsSecretAccessKey).ToCharArray();

        byte[] hashDate = ComputeKeyedHash(algorithm, Encoding.UTF8.GetBytes(ksecret), Encoding.UTF8.GetBytes(date));
        byte[] hashRegion = ComputeKeyedHash(algorithm, hashDate, Encoding.UTF8.GetBytes(region));
        byte[] hashService = ComputeKeyedHash(algorithm, hashRegion, Encoding.UTF8.GetBytes(service));
        return ComputeKeyedHash(algorithm, hashService, Encoding.UTF8.GetBytes(TERMINATOR));
    }


    /// Compute and return the hash of a data blob using the specified algorithm and key

    static byte[] ComputeKeyedHash(string algorithm, byte[] key, byte[] data)
    {
        var kha = KeyedHashAlgorithm.Create(algorithm);
        kha.Key = key;
        return kha.ComputeHash(data);
    }

    /// Helper to format a byte array into string
    static string ToHexString(byte[] data, bool lowercase)
    {
        var sb = new StringBuilder();
        for (var i = 0; i < data.Length; i++)
        {
            sb.Append(data[i].ToString(lowercase ? "x2" : "X2"));
        }
        return sb.ToString();
    }
}

}

0 个答案:

没有答案