2012-10-22 3 views
7

Ich versuche, eine Signatur für eine Amazon Glacier-Upload-Anfrage zu erstellen, die example requests und example functions von der AWS-Dokumentation verwendet, aber ich kann es nicht funktionieren. An diesem Punkt, ich bin sicher, dass ich etwas unglaublich offensichtlich bin fehlt:Wie kann ich eine AWS API-Signatur (v4) in Python berechnen?

#!/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 

Wenn ich mein Programm laufen lasse, erhalte ich die folgende hash:

$ python test.py 
3431315da57da4df28f92895c75364d94b36c745896ad3e580c0a6ae403b1e05 

Doch die Dokumente eindeutig Zustand:

Wenn der geheimen Zugriffsschlüssel, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY, verwendet wird, dann wird die berechnete Signatur:

3ce5b2f2fffac9262b4da 9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

Was fehlt mir?

Antwort

7

Ihre Funktion unterscheidet sich von ihrer in einer Hinsicht. Sie tun

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

aber sie tun

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

So abgeleiteten Schlüssel falsch ist. Sie möchten hexdigest nur im letzten Schritt des Prozesses verwenden, nicht beim Berechnen des Signaturschlüssels.

+4

Das hat es getan. Für jeden, der das später findet, können Sie die in dieser Antwort angegebene Änderung vornehmen, dann fügen Sie 'import binascii' oben hinzu und ändern Sie die' print' Zeile in 'print binascii.hexlify (signature)', unter der Annahme, dass Python 2.x. – Christopher

Verwandte Themen