web-dev-qa-db-fra.com

Calculer un SHA hachage avec une chaîne + clé secrète dans python

Amazon Product API nécessite désormais une signature avec chaque demande que j'essaie de générer en utilisant Python.

L'étape à laquelle je suis suspendu est celle-ci:

"Calculez un HMAC conforme à la RFC 2104 avec l'algorithme de hachage SHA256 en utilisant la chaîne ci-dessus avec notre clé d'accès secrète" factice ": 1234567890. Pour plus d'informations sur cette étape, consultez la documentation et des exemples de code pour votre langage de programmation."

Étant donné une chaîne et une clé secrète (dans ce cas 1234567890), comment puis-je calculer ce hachage en utilisant Python?

----------- MISE À JOUR -------------

La première solution utilisant HMAC.new semble correcte mais j'obtiens un résultat différent d'eux.

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

Selon l'exemple d'Amazon lorsque vous hachez la clé secrète 1234567890 et la chaîne suivante

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

Vous devriez obtenir la signature suivante: 'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg='

Je reçois ceci: '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
Filip Salomonsson
import hmac
import hashlib
import base64

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

Je sais que cela semble idiot, mais assurez-vous que vous n'avez pas d'espace de fuite sur votre secret par accident.

12
George Campbell

De http://docs.python.org/library/hashlib.html#module-hashlib (un peu modifié):

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

# Get string and put into givenString.

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

Si vous essayez d'inscrire un utilisateur à AWS cognito à l'aide de Python3, vous pouvez utiliser le code suivant.

#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()

Le nom d'utilisateur nom_utilisateur ci-dessus est le même que l'utilisateur que vous souhaitez enregistrer dans le cognito

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