2012-01-26 11 views
6

Wydaje mi się, że przeczytałem prawie wszystko, co można przeczytać na podstawie kodowania base-64 podpisu w przeglądarce, postu opartego na formularzu do S3: starych dokumentów i nowych dokumentów. Na przykład:Python Generowany podpis dla S3 Post

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

I nawet znaleźć to:

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

Zamiast używać wyżej lub nowszej generator polityki Amazon, lub bawić się wokół z Inii, próbuję do opracowania prostszy skrypt .py, który ściąga regułę JSON z pliku jawnego tekstu (policy.txt), a następnie generuje niezbędną sygnaturę zakodowaną w standardzie 64, aby pomóc mi przygotować wersję HTML.

Sam podpis (który jest zależny od zakodowanej polityki) NIE jest poprawnie zakodowany ... może z powodu jakiegoś problemu utf-8 vs. ascii lub \ n (newline)?

Skrypt, nad którym pracuję, znajduje się poniżej, zasady i klucz tajny AWS private_key pochodzą z przypadku testowego AWS, którego używam do sprawdzenia, czy ten skrypt działa. Poprawnie zakodowany podpis - cytowany przez Amazon - jest zawarty w poniższym skrypcie jako odniesienie.

Czy ktoś może mi powiedzieć, dlaczego podpis obliczony poniżej nie pasuje do podpisu odniesienie dostarczone przez Amazon ?:

Innymi słowy:

dlaczego tak jest poprawnie zakodowany:

policy_encoded = base64.b64encode(policy) 

ale ten NIE jest:

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

PYTHON podpis 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=" 

Polityka 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 ...Tak mi przykro! Nawet ich nie widziałem! :(Trudno było przekonać redaktora SO do zaakceptowania bloku JSON z wcięciami Czy możesz - jednym słowem powiedzieć mi, na czym powinienem się skupić, rozwiązując to ...? – Sean

+1

Użyj 'Ctrl + K' dla wcięcia bloku kodów automatycznie doda 4 spacje, spójrz na to, co edytowałem (kliknij [x min temu] (http://stackoverflow.com/posts/9018767/revisions), aby uzyskać poprzednie wersje). główny kod jest nadal źle sformatowany i jest zbyt "..." i zbyt WORDS. Powiedziałbym również, że twoje pytanie wygląda trochę "przerażająco", skupione pytanie zostanie prawdopodobnie rozwiązane * (pisanie dobrych pytań nigdy nie jest łatwe) * –

+0

W porządku.Dziękuję ... Zwróciliśmy uwagę na zmiany, myślę, że postaram się je zacieśnić i sprawię, że będzie mniej gadatliwy. – Sean

Odpowiedz

5

myślę, że to jest w dół do zawartości pliku policy.txt.

Wziąłem politykę od odwołania łącza (http://doc.s3.amazonaws.com/proposals/post.html) i zapisać go jako 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", ""], 
    ] 
} 

W celu uzyskania dokładnego sam podpis, ten plik musi mieć dokładnie te same treści.

Dla porównania, kiedy kopiowane i wklejane: MD5 (policy.txt) = 5bce89d9ff799e2064c136d76bc7fc7a

Jeśli używam następujący skrypt (takie same, tylko dopasować nazwę pliku i usunąć 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=" 

Wyjście uzyskać:

 
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= 

Tak Twój kod działa, po prostu myśleć logujesz nieco inny polityka (białe spacje)