2012-10-22 25 views
7

Tôi đang cố gắng tạo chữ ký cho yêu cầu tải lên Amazon Glacier, sử dụng example requestsexample functions do tài liệu AWS cung cấp, nhưng tôi không thể làm cho nó hoạt động. Tại thời điểm này, tôi chắc chắn tôi là thiếu một cái gì đó vô cùng rõ ràng:Tôi làm cách nào để tính toán chữ ký API AWS (v4) trong python?

#!/bin/env python 

import hmac 
import hashlib 

# This string to sign taken from: http://docs.amazonwebservices.com/amazonglacier/latest/dev/amazon-glacier-signing-requests.html#example-signature-calculation 
sts = """AWS4-HMAC-SHA256 
20120525T002453Z 
20120525/us-east-1/glacier/aws4_request 
5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743""" 

# These two functions taken from: http://docs.amazonwebservices.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python 
def sign(key, msg): 
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).hexdigest() 

# The fake secret key is provided by the referenced docs 
def getSignatureKey(): 
    kDate = sign(("AWS4" + "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY").encode('utf-8'), "20120525") 
    kRegion = sign(kDate, "us-east-1") 
    kService = sign(kRegion, "glacier") 
    kSigning = sign(kService, "aws4_request") 
    return kSigning 

signature = sign(getSignatureKey(), sts) 
print signature 

Nếu tôi chạy chương trình của tôi, tôi nhận được băm sau:

$ python test.py 
3431315da57da4df28f92895c75364d94b36c745896ad3e580c0a6ae403b1e05 

Tuy nhiên, các tài liệu nêu rõ:

Nếu khóa truy cập bí mật, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY, được sử dụng, sau đó chữ ký tính là:

3ce5b2f2fffac9262b4da 9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

Tôi đang thiếu gì?

Trả lời

7

Chức năng của bạn khác với chức năng của chúng theo một khía cạnh. Bạn đang làm

def sign(key, msg): 
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).hexdigest() 

nhưng họ đang làm

def sign(key, msg): 
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest() 

Vì vậy, quan trọng bắt nguồn của bạn là sai. Bạn chỉ muốn sử dụng hexdigest ở bước cuối cùng của quá trình, chứ không phải khi tính toán khóa ký.

+4

Điều đó đã xảy ra. Đối với bất kỳ ai tìm thấy điều này sau, bạn có thể thực hiện thay đổi được nêu trong câu trả lời này, sau đó thêm 'import binascii' lên trên và thay đổi dòng' print' thành 'print binascii.hexlify (signature)', giả sử python 2.x. – Christopher

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