我正在努力通过S3 signing example。但我没有在他们的文档中获得临时答案。我在iex
开始:S3在Elixir中对浏览器POST命令进行签名
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
出来,而不是亚马逊的例子更短。
对于签名我有这些助手:
@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")
但这出来比测试答案短。会欢迎一些指针。
嗨,非常感谢。我现在有一个长度相同的字符串,但是有大写字母,并且小写字母不够用,请重新查看我的代码 –
这似乎有效,但现在我很惊讶,因为当我重读说明书时,会谈到十六进制编码最终签名,并且不起作用(结果太短) –