2016-07-02 3 views
1

Я пытаюсь работать через S3 signing example. Но я не получаю промежуточные ответы в своих документах. Я начал в iex с:S3 подписание команд браузера POST в Elixir

policy = %{"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"} 
     ] 
    } 

stringToSign = policy |> Poison.encode! |> Base.encode64 

Но stringToSign выходит довольно короче, чем, например Amazon.

Для подписи у меня есть эти помощники:

@secret_key "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" 

def signing_key2(secret, date, region, service) do 
    hash_sha256("AWS4" <> secret, date) 
    |> hash_sha256(region) 
    |> hash_sha256(service) 
    |> hash_sha256("aws4_request") 
end 

def hash_sha256(secret, msg) do 
    hash_sha256_bis(secret, msg) 
    |> Base.url_encode64 
end 

def hash_sha256_bis(secret, msg) do 
    :crypto.hmac(:sha256, secret, msg) 
end 

и побежал

signing_key2(@secret_key, "20151229", "us-east-1", "s3") 

, но это вышло короче, чем тест-ответ. Хотелось бы приветствовать некоторых указателей.

ответ

1

Вы неправильно создали производный ключ. Вы не должны быть base64, кодируя промежуточные результаты hmac.

Только HMAC фактической строки подписать необходимо любую кодировку и что просто должно быть выходом в базе 16 (через Base.encode16(case: :lower)

+0

Привет, спасибо большое. У меня теперь строка одинаковой длины, но с капителями и там, где делаю ее в нижнем регистре, не будет достаточно. Будет ли переписываться с моим кодом, хотя –

+0

Кажется, что это работает, но сейчас Я удивлен, когда, перечитав инструкции, он говорит о шестнадцатеричном кодировании окончательной подписи, и это не работает (результат слишком короткий) –

1

Если вы декодировать base64 строку из примера амазонки, вы заметите, что они используют \ г \ п, как символ новой строки:

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

отметить также двойной символ новой строки там, что вы не получите от Яда. Для того, чтобы получить тот же результат base64, вы можете сделать:

s = ~s({ "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" } 
    ] 
}) 
iex(24)> s |> String.replace("\n", "\r\n") |> Base.encode64 
"eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9" 

Не так уверен, как рассчитать окончательную подпись, но это объясняет различные значения для закодированной строки base64.

+0

Спасибо. Я немного волновался, насколько чувствительно это все глупые вещи, как каретка возвращается! –

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