it-swarm.com.de

Berechnung eines SHA mit einem String + geheimem Schlüssel in python

Für die Amazon-Produkt-API ist jetzt eine Signatur für jede Anforderung erforderlich, die Python verwenden soll.

Der Schritt, an dem ich aufgehängt werde, ist der folgende:

"Berechnen Sie einen RFC 2104-kompatiblen HMAC mit dem SHA256-Hash-Algorithmus unter Verwendung der obigen Zeichenfolge mit unserem" Dummy "Secret Access Key: 1234567890. Weitere Informationen zu diesem Schritt finden Sie in der Dokumentation und in Codebeispielen für Ihre Programmiersprache."

Wie berechne ich diesen Hash mit einem String und einem geheimen Schlüssel (in diesem Fall 1234567890) in Python?

----------- UPDATE -------------

Die erste Lösung mit HMAC.new sieht korrekt aus, aber ich erhalte ein anderes Ergebnis als sie.

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

Nach dem Beispiel von Amazon, wenn Sie den geheimen Schlüssel 1234567890 und die folgende Zeichenfolge haben

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

Sie sollten die folgende Unterschrift erhalten: 'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg='

Ich bekomme das: '411a59403c9f58b4a434c9c6a14ef6e363acc1d1bb2c6faf9adc30e20898c83b'

45
mymmaster
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='
97
SilentGhost
>>> 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='
12
import hmac
import hashlib
import base64

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

Ich weiß, das hört sich albern an, aber stellen Sie sicher, dass Sie nicht versehentlich ein Leerzeichen in Ihrem Geheimnis haben.

12
George Campbell

Von http://docs.python.org/library/hashlib.html#module-hashlib (etwas geändert):

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

# Get string and put into givenString.

m.update(givenString + secretKey)
m.digest()
4
Andrew Keeton

Wenn Sie versuchen, einen Benutzer mit Python3 bei AWS Cognito anzumelden, können Sie den folgenden Code verwenden.

#For the SecretHash 
import hmac
import hashlib
import base64   

//Please note that the b in the secretKey and encode('utf-8') are really really important. 
secretKey = b"secret key that you get from Coginito -> User Pool -> General Settings -> App Clients-->Click on Show more details -> App client secret  "
 clientId = "Coginito -> User Pool -> General Settings -> App Clients-->App client id"
 digest = hmac.new(secretKey,
              msg=(user_name + clientId).encode('utf-8'),
              digestmod=hashlib.sha256
             ).digest()
 secrethash = base64.b64encode(digest).decode()

Der Benutzername benutzername oben ist derselbe wie der Benutzer, den Sie im Cognito registrieren möchten

client = boto3.client('cognito-idp', region_name='eu-west-1' )

response = client.sign_up(
                    ClientId='Coginito -> User Pool -> General Settings -> App Clients-->App client id',
                    Username='Username of the person you are planning to register',
                    Password='Password of the person you are planning to register',
                    SecretHash=secrethash,
                    UserAttributes=[
                        {
                            'Name': 'given_name',
                            'Value': given_name
                        },
                        {
                            'Name': 'family_name',
                            'Value': family_name
                        },
                        {
                            'Name': 'email',
                            'Value': user_email
                        }
                    ],
                    ValidationData=[
                        {
                            'Name': 'email',
                            'Value': user_email
                        },
                    ]
1
Haris Np