2009-08-20 31 views
36

API sản phẩm của Amazon hiện yêu cầu chữ ký với mọi yêu cầu mà tôi đang cố gắng tạo ra việc sử dụng Python.Tính toán giá trị băm SHA bằng chuỗi + khóa bí mật trong python

Bước tôi nhận được hung lên trên là này một:

"Tính toán một RFC 2104-compliant HMAC với các thuật toán SHA256 băm bằng cách sử dụng chuỗi trên với chúng tôi 'giả' bí mật Access Key: 1234567890. Để biết thêm thông tin về bước này, xem tài liệu và mã mẫu cho ngôn ngữ lập trình của bạn. "

Cho một chuỗi và một khóa bí mật (trong trường hợp này là 1234567890) làm cách nào để tính giá trị băm này bằng Python?

----------- CẬP NHẬT -------------

Các giải pháp đầu tiên sử dụng HMAC.new vẻ đúng tuy nhiên tôi nhận được một kết quả khác nhau hơn thế.

http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html

Theo ví dụ của Amazon khi bạn băm khóa bí mật 1234567890 và chuỗi sau

GET 
webservices.amazon.com 
/onca/xml 
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I 
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview 
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z& 
Version=2009-01-06 

Bạn sẽ nhận được chữ ký sau đây: 'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg='

Tôi nhận được điều này: '411a59403c9f58b4a434c9c6a14ef6e363acc1d1bb2c6faf9adc30e20898c83b'

+0

Bạn có thể tìm thấy tiện ích này hữu ích. Thuật toán ký một yêu cầu REST tới Amazon được mô tả trong [http://stackoverflow.com/questions/1088715/how-to-sign-amazon-web-service-requests-from-the-python-app-engine/ 1343917 # 1343917] (http://stackoverflow.com/questions/1088715/how-to-sign-amazon-web-service-requests-from-the-python-app-engine/1343917#1343917) – alsan

Trả lời

77
import hmac 
import hashlib 
import base64 
dig = hmac.new(b'1234567890', msg=your_bytes_string, digestmod=hashlib.sha256).digest() 
base64.b64encode(dig).decode()  # py3k-mode 
'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=' 
+0

Cảm ơn. Điều này có vẻ đúng nhưng tôi không có kết quả tương tự như Amazon. Xem bản cập nhật ở trên. – mymmaster

+0

Mã băm của chúng trông giống như mã hóa base64. – Eli

+0

Chính xác là như vậy. Cần mã hóa trong base64. Cảm ơn. – mymmaster

2

Từ http://docs.python.org/library/hashlib.html#module-hashlib (đã sửa đổi một chút):

import hashlib 
secretKey = "1234567890" 
m = hashlib.sha256() 

# Get string and put into givenString. 

m.update(givenString + secretKey) 
m.digest() 
+0

Argh! Tôi đã quá 8 giây quá muộn! ;) –

+1

Bạn có thể cần cài đặt py25-hashlib. Tôi đã thử kiểm tra mã này trên Python 2.5.4 (ngày 5 tháng 3 năm 2009) nhưng có 'ImportError: Không có module nào có tên _md5'. –

10
>>> import hmac 
>>> import hashlib 
>>> import base64 
>>> s = """GET 
... webservices.amazon.com 
... /onca/xml 
... AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06""" 
>>> base64.b64encode(hmac.new("1234567890", msg=s, digestmod=hashlib.sha256).digest()) 
'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=' 
+0

Bậc thầy thực sự của giải pháp ... –

6
import hmac 
import hashlib 
import base64 

digest = hmac.new(secret, msg=thing_to_hash, digestmod=hashlib.sha256).digest() 
signature = base64.b64encode(digest).decode() 

Tôi biết điều này nghe có vẻ ngớ ngẩn, nhưng chắc chắn rằng bạn không có một không gian dấu vào bí mật của bạn một cách tình cờ.

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