2016-04-15 1 views
2

Я следую примеру выше, чтобы создать «в кодировке Base64 строку политики» и «подпись-значение» с Java бэкэндом: http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.htmlAWS4 Signature с Java для браузерного сообщения

Но моей «подпись стоимостью "не соответствует этому примеру. Я что-то упустил?

Я считаю, что getSignatureKey и HmacSHA256 в порядке, потому что я нашел в надежном источнике. Возможно, неверно getStringToSign.

Вот мой код:

import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

import org.apache.commons.codec.binary.Base64; 
import static com.google.common.io.BaseEncoding.base16; 

public class AwsSignatureGenerator { 

    public static void main(String[] args) throws Exception { 
     String signature = getSignature(getSignatureKey("wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", 
                 "20151229", 
                 "us-east-1", 
                 "s3")); 
     System.out.println(signature); 
    } 

    public static String getStringToSign(){ 
     String s3Policy = "{ \"expiration\": \"2015-12-30T12:00:00.000Z\", \"conditions\": [ {\"bucket\": \"sigv4examplebucket\"}, [\"starts-with\", \"$key\", \"user/user1/\"], {\"acl\": \"public-read\"}, {\"success_action_redirect\": \"http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html\"}, [\"starts-with\", \"$Content-Type\", \"image/\"], {\"x-amz-meta-uuid\": \"14365123651274\"}, {\"x-amz-server-side-encryption\": \"AES256\"}, [\"starts-with\", \"$x-amz-meta-tag\", \"\"], {\"x-amz-credential\": \"AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request\"}, {\"x-amz-algorithm\": \"AWS4-HMAC-SHA256\"}, {\"x-amz-date\": \"20151229T000000Z\" } ] }"; 
     return new Base64().encodeAsString(s3Policy.getBytes()); 
    } 

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

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

    public static String getSignature(byte[] key) throws Exception{ 
     return base16().lowerCase().encode(HmacSHA256(getStringToSign(), key)); 
    } 
} 
+0

Не могли бы вы разместить примерное местоположение ошибки в вашем коде? –

+0

Я верю, что «getSignatureKey» и «HmacSHA256» в порядке, потому что я нашел в надежном источнике. Возможно, ** ** getStringToSign ** ** не корректно **. – felipepastorelima

ответ

1

Я проверил свою политику В base64 это выглядит следующим образом:

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLCAiY29uZGl0aW9ucyI6IFsgeyJidWNrZXQiOiAic2lndjRleGFtcGxlYnVja2V0In0sIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJ1c2VyL3VzZXIxLyJdLCB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LCB7InN1Y2Nlc3NfYWN0aW9uX3JlZGlyZWN0IjogImh0dHA6Ly9zaWd2NGV4YW1wbGVidWNrZXQuczMuYW1hem9uYXdzLmNvbS9zdWNjZXNzZnVsX3VwbG9hZC5odG1sIn0sIFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICJpbWFnZS8iXSwgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwgeyJ4LWFtei1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uIjogIkFFUzI1NiJ9LCBbInN0YXJ0cy13aXRoIiwgIiR4LWFtei1tZXRhLXRhZyIsICIiXSwgeyJ4LWFtei1jcmVkZW50aWFsIjogIkFLSUFJT1NGT0ROTjdFWEFNUExFLzIwMTUxMjI5L3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QifSwgeyJ4LWFtei1hbGdvcml0aG0iOiAiQVdTNC1ITUFDLVNIQTI1NiJ9LCB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfSBdIH0= 

В формате JSON, это выглядит следующим образом:

{ 
    "expiration": "2015-12-30T12:00:00.000Z", 
    "conditions": [ 
     { 
      "bucket": "sigv4examplebucket" 
     }, 
     [ 
      "starts-with", 
      "$key", 
      "user/user1/" 
     ], 
     { 
      "acl": "public-read" 
     }, 
     { 
      "success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html" 
     }, 
     [ 
      "starts-with", 
      "$Content-Type", 
      "image/" 
     ], 
     { 
      "x-amz-meta-uuid": "14365123651274" 
     }, 
     { 
      "x-amz-server-side-encryption": "AES256" 
     }, 
     [ 
      "starts-with", 
      "$x-amz-meta-tag", 
      "" 
     ], 
     { 
      "x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request" 
     }, 
     { 
      "x-amz-algorithm": "AWS4-HMAC-SHA256" 
     }, 
     { 
      "x-amz-date": "20151229T000000Z" 
     } 
    ] 
} 

На основе вашего JSON и ключей правильная подпись должна быть:

eb9df8c47e9c4bd6090809ed799f0146c71a10f7707aa1acc2c13e736d41ed54 

В соответствии с этим приложением, которое я создал ->http://ttwd80.github.io/s3postcalculatorverify/

Я бы, однако пропустить х-АМЗ-даты и х-АМЗ-мета-UUID

Также обратите внимание, что в поле «файл» должен быть последним в форме (кроме кнопки отправки).

Смежные вопросы