2012-01-26 2 views
6

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

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

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

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

Вместо использования выше или более новую версию генератора политики Амазонки, или возиться с Бото, я пытаюсь по подготовке проекта более простой скрипт .py, который вытаскивает политику JSON из файла plaintext (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 signature c alculator ...

#!/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", ""] 
] 
} 
+0

Rik: ugh ...Мне очень жаль! Даже не видел их! :(С трудом получал редактор SO, чтобы принять блок JSON с отступом. Можете ли вы - одним словом - сказать мне, на что я должен быть сосредоточен в решении этого вопроса? – Sean

+1

Используйте 'Ctrl + K' для отступающего блока кодов он автоматически добавит 4 пробела, взгляните на то, что я отредактировал (щелкните [x мин. назад] (http://stackoverflow.com/posts/9018767/revisions) с предыдущими версиями). главный код все еще плохо отформатирован, и есть слишком «...» и тоже «СЛОВА». Я бы также сказал, что ваш вопрос выглядит немного «страшно», сфокусированный вопрос будет более разрешен * (писать хорошие вопросы никогда не бывает легко) * –

+0

Хорошо, спасибо. Ну, я думаю, вернусь к твоим изменениям, я попытаюсь подтянуть его и сделать его менее подробным. – Sean

ответ

5

Я думаю, что это вниз к содержимому файла 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= 

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

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