Сгенерированная Python подпись для S3 Post - PullRequest
6 голосов
/ 26 января 2012

Я думаю, что я прочитал почти все, что нужно для чтения в кодировке base-64 подписи для браузера, публикации на основе форм для S3: старые документы и новые документы. Например:

http://doc.s3.amazonaws.com/proposals/post.html

И даже нашел это:

http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html

Вместо того, чтобы использовать приведенный выше или более новый генератор политик Amazon или возиться с Boto, я пытаюсь составить более простой сценарий .py, который извлекает JSON политики из открытого текста (policy.txt), а затем создает необходимая подпись в кодировке base-64, чтобы помочь мне составить форму HTML.

Сама подпись (которая зависит от закодированной политики) НЕ кодируется правильно ... может быть, из-за какой-то проблемы utf-8 против ascii или \ n (новая строка)?

Ниже приведен скрипт, с которым я работаю, политика и секретный ключ AWS private_key взяты из теста AWS, который я использую, чтобы проверить, работает ли этот скрипт. Правильно закодированная подпись, указанная Amazon, включена в приведенный ниже скрипт для справки.

Может кто-нибудь сказать мне, почему подпись, рассчитанная ниже, не соответствует эталонной подписи, предоставленной Amazon?:

Другими словами:

Почему это правильно закодировано:

policy_encoded = base64.b64encode(policy)

но это НЕ:

signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())

Калькулятор подписи PYTHON ...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import base64, hmac, sha
from sys import argv

script, policy = argv

private_key = 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o'
input = open("..Desktop/policy.txt", "rb")
policy = input.read()
policy_encoded = base64.b64encode(policy)
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())
print "Your policy base-64 encoded is %s." % (policy_encoded)
print "Your signature base-64 encoded is %s." % (signature)
print "Your signature encoded should be 2qCp0odXe7A9IYyUVqn0w2adtCA="

Политика JSON (policy.txt - UTF-8)

{ "expiration": "2007-12-01T12:00:00.000Z",
"conditions": [
{"bucket": "johnsmith"},
["starts-with", "$key", "user/eric/"],
{"acl": "public-read"},
{"success_action_redirect": "http://johnsmith.s3.amazonaws.com/successful_upload.html"},
["starts-with", "$Content-Type", "image/"],
{"x-amz-meta-uuid": "14365123651274"},
["starts-with", "$x-amz-meta-tag", ""]
]
}

1 Ответ

5 голосов
/ 17 июля 2013

Я думаю, это относится к содержимому вашего файла policy.txt.

Я взял политику по ссылочной ссылке (http://doc.s3.amazonaws.com/proposals/post.html) и сохранил ее как policy.txt

{ "expiration": "2007-12-01T12:00:00.000Z",
  "conditions": [
    {"bucket": "johnsmith" },
    ["starts-with", "$key", "user/eric/"],
    {"acl": "public-read" },
    {"redirect": "http://johnsmith.s3.amazonaws.com/successful_upload.html" },
    ["starts-with", "$Content-Type", "image/"],
    {"x-amz-meta-uuid": "14365123651274"},
    ["starts-with", "$x-amz-meta-tag", ""],
  ]
}

Чтобы получить точно такую ​​же подпись, этот файл должен иметь точно такое же содержимое.

Для справки, когда я скопировал и вставил: MD5 (policy.txt) = 5bce89d9ff799e2064c136d76bc7fc7a

Если я использую следующий скрипт (такой же, как у вас, просто настройте имя файла и удалите args)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import base64, hmac, sha

private_key = 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o'
input = open("policy.txt", "rb")
policy = input.read()
policy_encoded = base64.b64encode(policy)
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())
print "Your policy base-64 encoded is %s." % (policy_encoded)
print "Your signature base-64 encoded is %s." % (signature)
print "Your signature encoded should be 2qCp0odXe7A9IYyUVqn0w2adtCA="

Вывод получу:

Your policy base-64 encoded is
eyAiZXhwaXJhdGlvbiI6ICIyMDA3LTEyLTAxVDEyOjAwOjAwLjAwMFoiLAogICJjb25kaXRpb25zIjo
gWwogICAgeyJidWNrZXQiOiAiam9obnNtaXRoIiB9LAogICAgWyJzdGFydHMtd2l0aCIsICIka2V5Ii
wgInVzZXIvZXJpYy8iXSwKICAgIHsiYWNsIjogInB1YmxpYy1yZWFkIiB9LAogICAgeyJyZWRpcmVjd
CI6ICJodHRwOi8vam9obnNtaXRoLnMzLmFtYXpvbmF3cy5jb20vc3VjY2Vzc2Z1bF91cGxvYWQuaHRt
bCIgfSwKICAgIFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICJpbWFnZS8iXSwKICAgIHs
ieC1hbXotbWV0YS11dWlkIjogIjE0MzY1MTIzNjUxMjc0In0sCiAgICBbInN0YXJ0cy13aXRoIiwgIi
R4LWFtei1tZXRhLXRhZyIsICIiXSwKICBdCn0K
Your signature base-64 encoded is 2qCp0odXe7A9IYyUVqn0w2adtCA=
Your signature encoded should be 2qCp0odXe7A9IYyUVqn0w2adtCA=

Итак, ваш код работает,Я просто думаю, что вы подписываете немного другую политику (различия между пробелами)

...