Python Generated Signature para S3 Post

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

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

Y hasta encontré esto:

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

En lugar de usar el generador de políticas más nuevo de Amazon o el de arriba, o jugar con Boto, estoy tratando de redactar un script .py más simple que extraiga el JSON de políticas de un archivo de texto sin formato (policy.txt) y luego genere la base 64 firma codificada para ayudarme a redactar el formulario HTML.

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

El script con el que estoy trabajando se encuentra a continuación, la política y la clave private_key clave secreta de AWS son de un caso de prueba de AWS que estoy usando para ver si este script funciona. La firma correctamente codificada, según lo citado por Amazon, se incluye en el siguiente script para referencia.

¿Alguien puede decirme por qué la firma que se calcula a continuación no coincide con la firma de referencia proporcionada por Amazon ?:

En otras palabras:

Por qué esto está correctamente codificado:

 policy_encoded = base64.b64encode(policy) 

pero este NO es:

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

Calculadora de firma 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=" 

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

Creo que esto depende del contenido de su archivo policy.txt.

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

Para obtener la misma firma exacta, este archivo debe tener exactamente el mismo contenido.

Para referencia, cuando copié y pegué: MD5 (policy.txt) = 5bce89d9ff799e2064c136d76bc7fc7a

Si uso la siguiente secuencia de comandos (igual que la suya, solo ajuste el nombre de archivo y elimine los 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=" 

La salida me sale:

 Su política base-64 codificada es
 eyAiZXhwaXJhdGlvbiI6ICIyMDA3LTEyLTAxVDEyOjAwOjAwLjAwMFoiLAogICJjb25kaXRpb25zIjo
 gWwogICAgeyJidWNrZXQiOiAiam9obnNtaXRoIiB9LAogICAgWyJzdGFydHMtd2l0aCIsICIka2V5Ii
 wgInVzZXIvZXJpYy8iXSwKICAgIHsiYWNsIjogInB1YmxpYy1yZWFkIiB9LAogICAgeyJyZWRpcmVjd
 CI6ICJodHRwOi8vam9obnNtaXRoLnMzLmFtYXpvbmF3cy5jb20vc3VjY2Vzc2Z1bF91cGxvYWQuaHRt
 bCIgfSwKICAgIFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICJpbWFnZS8iXSwKICAgIHs
 ieC1hbXotbWV0YS11dWlkIjogIjE0MzY1MTIzNjUxMjc0In0sCiAgICBbInN0YXJ0cy13aXRoIiwgIi
 R4LWFtei1tZXRhLXRhZyIsICIiXSwKICBdCn0K
 Su firma codificada en base-64 es 2qCp0odXe7A9IYyUVqn0w2adtCA =
 Su firma codificada debe ser 2qCp0odXe7A9IYyUVqn0w2adtCA =

Entonces, su código funciona, solo creo que está firmando una política ligeramente diferente (diferencias de espacios en blanco)