Python Generated Signature for S3 Post

Кажется, я прочитал почти все, что можно прочитать о кодировке подписи base-64 для in-browser, form-based post to S3: old docs and new docs. Например:

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 (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", ""]
]
}

6
задан Sean 26 January 2012 в 21:12
поделиться