2012-01-26 21 views
6

Tôi nghĩ rằng tôi đã đọc gần như mọi thứ để đọc trên mã hóa base-64 của chữ ký cho trong trình duyệt, dạng bài đăng dựa trên S3: tài liệu cũ và tài liệu mới. Ví dụ:Chữ ký được tạo bằng Python cho S3 Post

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

Và thậm chí thấy câu này:

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

Thay vì sử dụng ở trên hoặc máy phát điện chính sách mới của Amazon, hoặc fiddle xung quanh với Boto, tôi đang cố gắng để soạn thảo script đơn giản .py để kéo JSON chính sách từ một tệp văn bản thuần túy (policy.txt), và sau đó tạo chữ ký được mã hóa cơ sở 64 cần thiết để giúp tôi soạn thảo biểu mẫu HTML.

Bản thân chữ ký (phụ thuộc vào chính sách được mã hóa) KHÔNG được mã hóa chính xác ... có thể do một số loại vấn đề utf-8 so với ascii hoặc \ n (dòng mới)?

Tập lệnh tôi đang làm việc bên dưới, chính sách và Khóa bảo mật AWS private_key là từ trường hợp kiểm tra AWS tôi đang sử dụng để xem tập lệnh này có hoạt động hay không. Chữ ký được mã hóa chính xác - được trích dẫn bởi Amazon - được bao gồm trong tập lệnh bên dưới để tham khảo.

bất cứ ai có thể cho tôi biết tại sao chữ ký theo tính toán dưới đây không khớp với chữ ký tài liệu tham khảo được cung cấp bởi Amazon ?:

Nói cách khác:

Tại sao điều này được mã hóa một cách chính xác:

policy_encoded = base64.b64encode(policy) 

nhưng cái này KHÔNG phải là:

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

Chữ ký PYTHON 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 chính sách (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 ...Tôi rất xin lỗi! Thậm chí không nhìn thấy chúng! :(Đã có một thời gian khó khăn để trình soạn thảo SO chấp nhận khối JSON với các thụt lề.Bạn có thể - trong một từ - cho tôi biết tôi nên tập trung vào việc giải quyết điều này ...? – Sean

+1

Sử dụng 'Ctrl + K' để thụt lề khối mã, nó sẽ tự động thêm 4 dấu cách, hãy xem những gì tôi đã chỉnh sửa (nhấp [x phút trước] (http://stackoverflow.com/posts/9018767/revisions) để xem các bản sửa đổi trước đó). mã chính vẫn còn bị định dạng sai và cũng có quá '...' và quá TỪ Tôi cũng nói rằng câu hỏi của bạn trông hơi "đáng sợ", câu hỏi tập trung sẽ có nhiều khả năng được giải quyết * (để viết câu hỏi hay không bao giờ là dễ dàng) * –

+0

Được rồi, xin cảm ơn, tôi đã cố gắng thắt chặt nó và làm cho nó ít tiết hơn. – Sean

Trả lời

5

Tôi nghĩ rằng đây là xuống đến nội dung của file policy.txt của bạn.

tôi mất chính sách từ liên kết tham chiếu (http://doc.s3.amazonaws.com/proposals/post.html) và lưu nó như 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", ""], 
    ] 
} 

Để có được chữ ký chính xác cùng, tập tin này phải có các nội dung chính xác như vậy.

Để tham khảo, khi tôi sao chép và dán: MD5 (policy.txt) = 5bce89d9ff799e2064c136d76bc7fc7a

Nếu tôi sử dụng đoạn mã sau (giống như bạn, chỉ cần điều chỉnh tên tập tin và loại bỏ 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=" 

Kết quả tôi nhận được:

 
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= 

Vì vậy, mã của bạn hoạt động, tôi nghĩ bạn đang ký một chút khác biệt chính sách (khoảng cách khoảng trắng)

Các vấn đề liên quan