2012-01-26 9 views
6

Creo que he leído casi todo lo que hay que leer sobre la codificación base-64 de una firma para el navegador, publicación basada en formularios en S3: documentos antiguos y documentos nuevos. Por ejemplo:Python Generated Signature para S3 Post

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

E incluso encontrado esto:

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

En lugar de utilizar los anteriores o generador de la política reciente de Amazon, o ver alrededor de Boto, estoy tratando de elaborar una script .py más simple que extrae la política JSON de un archivo de texto plano (policy.txt), y luego genera la firma codificada base 64 necesaria para ayudarme a redactar el formulario HTML.

La firma en sí (que depende de la política codificada) NO se está codificando correctamente ... ¿tal vez debido a algún tipo de problema de utf-8 vs. ascii o \ n (nueva línea)?

El script con el que estoy trabajando está debajo, la política y la clave secreta de AWS private_key son de un caso de prueba de AWS que estoy usando para ver si este script funciona. La firma codificada correctamente, citada por Amazon, se incluye en el siguiente script para referencia.

Puede alguien decirme por qué la firma según se especifica posteriormente no coincide con la firma de referencia proporcionado por Amazon ?:

En otras palabras:

Por qué esto está codificado correctamente:

policy_encoded = base64.b64encode(policy) 

pero este NO es:

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

Política 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 ...¡Lo siento mucho! ¡Ni siquiera los vi! :(Estaba teniendo dificultades para conseguir que el editor de SO aceptara el bloque JSON con sangrías. ¿Puede usted, en una palabra, decirme en qué debería centrarme para resolver esto ...? – Sean

+1

Use 'Ctrl + K' para sangrar el bloque de códigos, agregará automáticamente 4 espacios, eche un vistazo a lo que he editado (haga clic en [x min ago] (http://stackoverflow.com/posts/9018767/revisions) para ver las revisiones anteriores). El código principal todavía está mal formateado y también hay '...' y también PALABRAS. También diría que su pregunta parece un poco "aterradora", la pregunta enfocada se resolverá con mayor probabilidad * (escribir buenas preguntas nunca es fácil)) * –

+0

Muy bien. Gracias. Debidamente observado. Volví a sus ediciones, creo. Intentaré ajustarlo y hacerlo menos detallado. – Sean

Respuesta

5

Creo que esto se debe al contenido de su archivo policy.txt.

Tomé la política desde el enlace de referencia (http://doc.s3.amazonaws.com/proposals/post.html) y guardado como 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", ""], 
    ] 
} 

el fin de obtener la misma firma exacta, este archivo debe tener el mismo contenido exacto.

Como referencia, cuando copiado y pegado: MD5 (policy.txt) = 5bce89d9ff799e2064c136d76bc7fc7a

Si utilizo el siguiente script (mismos que los suyos, apenas ajuste nombre de archivo y eliminar 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=" 

salida me sale:

 
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= 

Por lo tanto, funciona su código, simplemente creo que está firmando un poco diferente política (diferencias de espacios en blanco)