2016-01-13 146 views

回答

2

您指向的文档是如何根据密钥派生签名密钥。看看他们的示例代码来计算签名。也许这会帮助你理解。他们创建的每个“k”参数都是先前计算的值的HMAC和密钥中的下一个值。

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

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; 
} 

所以首先他们采取秘密密钥与AWS4前置和使用为重点,以HMAC日期格式YYYYMMDD(每文档)。

接下来,他们将得到的HMAC并将其用作HMAC的关键字,例如区域名称us-east-1

接下来,他们将得到的HMAC作为HMAC的关键字,例如,服务名称为ec2

最后,他们将得到的HMAC作为HMAC的关键字aws4_request。生成的密钥是您的派生签名密钥。

一旦你有,你可以按如下生成请求签名的签名密钥:在将签名请求

signature = HexEncode(HMAC(derived-signing-key, string-to-sign)) 

说明可以在这里找到:

http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html