当前位置: 首页 > 知识库问答 >
问题:

如何计算AWS S3上传的签名

严成礼
2023-03-14

我试图用这个例子来计算s3上传的AWS4签名-http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

var exampleSecretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
var exampleBase64EncodedPolicy = "eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9";

var expectedValue = "8afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e";

var awsSignature = AWS4Signer.ComputeSignature("AKIAIOSFODNN7EXAMPLE", exampleSecretKey, "us-east-1", new DateTime(2015, 12, 29, 0, 0, 0, DateTimeKind.Utc), "s3", "", exampleBase64EncodedPolicy);

我正在使用示例中提供的值,但没有从ComputeSignature方法中获得期望值。我怀疑这是因为我正在为“signedheaders”参数传递一个空字符串(如果是,那么应该是什么?)。有人能解释一下我做错了什么吗?

共有2个答案

西门鹏程
2023-03-14

请试试这个。

import com.amazonaws.util.BinaryUtils;
import org.junit.Assert;
import org.junit.Test;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.util.Base64;

public class AwsTest {

    @Test
    public void test() throws Exception {
        String stringToSign = getStringToSign("<policy_json>");
        Assert.assertEquals("eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9", stringToSign);

        String signature = getSignature(stringToSign, "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "20151229", "us-east-1", "s3");
        Assert.assertEquals("8afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e", signature);
    }

    private static String getStringToSign(String policy) throws Exception {
        return Base64.getEncoder().encodeToString(policy.replaceAll("\n", "\r\n").getBytes("UTF-8"));
    }

    private static String getSignature(String stringToSign, String secretAccessKey, String dateStamp, String regionName, String serviceName) throws Exception {
        byte[] signingKey = getSignatureKey(secretAccessKey, dateStamp, regionName, serviceName);
        return BinaryUtils.toHex(HmacSHA256(stringToSign, signingKey));
    }


    private 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"));
    }

    private 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;
    }
}
崔单弓
2023-03-14

从来没有设法让它与AWS4Signer一起工作,但我已经设法手动完成了。

using System.Security.Cryptography;
using System.Text;

public static class S3UploadSignature
{
    /// <summary>
    /// Generates the X-Amz-Signature parameter for an S3 upload via the browser 
    /// </summary>
    /// <param name="base64EncodedPolicy">The upload policy JSON string encoded as base 64</param>
    /// <param name="awsSecretKey">The AWS secret identity key</param>
    /// <param name="date">The date the request was signed (yyyyMMdd)</param>
    /// <param name="regionName">The AWS region the bucket sits in e.g. us-east-1</param>
    /// <param name="serviceName">The AWS service name e.g. s3</param>
    public static string Create(string base64EncodedPolicy, string awsSecretKey, string date, string regionName, string serviceName)
    {
        var signatureKey = CalculteSignatureKey(awsSecretKey, date, regionName, serviceName);
        return ToBase16String(HmacSha256(base64EncodedPolicy, signatureKey));
    }

    private static string ToBase16String(byte[] bytes)
    {
        var result = new StringBuilder(bytes.Length * 2);

        foreach (var b in bytes)
            result.AppendFormat("{0:x2}", b);

        return result.ToString();
    }

    private static byte[] HmacSha256(string data, byte[] key)
    {
        return new HMACSHA256(key).ComputeHash(Encoding.UTF8.GetBytes(data));
    }

    private static byte[] CalculteSignatureKey(string key, string dateStamp, string regionName, string serviceName)
    {
        var secret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray());
        var date = HmacSha256(dateStamp, secret);
        var region = HmacSha256(regionName, date);
        var service = HmacSha256(serviceName, region);
        var signing = HmacSha256("aws4_request", service);

        return signing;
    }
}
 类似资料:
  • 我在让AWS签名计算工作时遇到问题。目标是读取作为URL的一部分传递的4(键、日期戳、regionName、serviceName),并使用它们计算签名。我不是Node.js专家,非常感谢您的帮助和时间。 URL示例:http://localhost:3000/getSignature?key=ASIAJSLN6INQGFK7XX7Q 我的Node.js代码。。。 我收到以下运行时错误: Type

  • 但是,没有关于如何完成这一点的例子。此外,如果没有设置凭据,即使在向S3请求上载之前,SDK也会出错 JS SDK文档中提到了这一点,因此似乎有可能:

  • 问题内容: 我正在尝试使用HMAC-SHA256算法创建签名,这是我的代码。我正在使用美国ASCII编码。 我从上面的代码中得到的结果是: 这与Wiki中显示的相同 除外 的。 如果我做对了所有事情,或者可能可以改善我的代码,我正在寻找想法/意见。 问题答案: 0x仅表示其后的字符表示一个十六进制字符串。 因此,0x只是为了阐明输出的格式,而无需担心它。

  • 问题内容: 我有一张桌子 PK在哪里,fk是外键。fk的值并不多,大约20。f2永远不会大于3。但是,有很多对。是。 现在,假设我们正在将100和200映射到A,将300和400映射到B,将500映射到C- 这个映射是给定的。我们想留下来。到目前为止,这大致可以通过以下方式解决 现在,问题在于我们需要在映射表中保留f2值0、1、2,因此这是期望的结果: 我真的很想将其保留在MySQL中。 问题答案

  • --Executor-Cores 5--Executor-Memory 35GB--num-Executors 6--conf spark.dynamicallocation.enabled=false 执行器内存计算(236 GB/6执行器)*0.9=35 GB 当我提交一个spark作业并查看spark UI或控制台的执行器度量时,这些数字非常不同,我对如何计算和提供这些度量感到困惑。执行器只

  • 问题内容: 在JavaScript中,有没有一种方法可以计算整个页面上有角度的手表的数量? 我们使用Batarang,但它并不总是适合我们的需求。我们的应用程序很大,我们对使用自动化测试来检查手表计数是否增加过多感兴趣。 在每个控制器的基础上计数手表也将很有用。 编辑 :这是我的尝试。它在ng-scope类中将手表计入所有内容。 问题答案: (您可能需要更改为或放置在任何位置) 感谢erilem指