2016-11-22 2 views
1

Selon cette page: Examples of How to Derive a Signing Key for Signature Version 4AWS4 Signature key - ce didacticiel est-il incorrect?

Le résultat de ce code:

$kSecret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"; 

$kDate = hash_hmac('sha256', "20120215", "AWS4" . $kSecret); 
echo "date: " . $kDate . "<br>"; 

$kRegion = hash_hmac('sha256', "us-east-1", $kDate); 
echo "region: " . $kRegion . "<br>"; 

$kService = hash_hmac('sha256', "iam", $kRegion); 
echo "service: " . $kService . "<br>"; 

$kSigning = hash_hmac('sha256', "aws4_request", $kService); 
echo "signing: " . $kSigning . "<br>"; 

devrait imprimer:

kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d' 

kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c' 

kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa' 

kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d' 

Alors, je reçois kDate est correcte. kRegion n'est pas correct que je reçois la valeur:

a59e30f9d899c47b3dd68ea1c0ab3bb529e03a8f4ed2f54cb64af547330a22a0 

J'ai essayé d'utiliser ce site pour calculer le HMAC (hmac generator) et je reçois le même résultat.

enter image description here

Je me demande vraiment si la page est erronée. Quelqu'un peut-il expliquer si c'est de ma faute ou de la faute d'AWS?

Merci

+0

S'il vous plaît supprimer immédiatement. Ne publiez pas votre clé secrète AWS. –

+0

c'est un exemple de clé fournie par AWS :) – MeV

+1

Oh, ouf. J'ai vu tellement de gens poster des clés secrètes. Désolé pour ça. –

Répondre

2
  1. Vous devez comprendre les valeurs sont binaires et imprimées sous forme hexadécimale
  2. Vous passez la date en hexadécimal. Vous devez le convertir en binaire et le transmettre avant d'appeler hash_hmac. Ou stockez-le en binaire et imprimez-le en hexadécimal
  3. Vous n'avez jamais mentionné la langue que vous utilisez. Je devais google pour savoir quelle langue vous utilisez. En PHP, vous pouvez passer: $ raw_output = true pour obtenir la chaîne binaire
  4. Stockez les chaînes binaires et convertissez-les en hex avant d'imprimer.

Comme je ne suis pas familier avec PHP, j'ai essayé la même chose en Python et la sortie correspondait à la sortie attendue. Voyez comment je le convertis en hex et imprime.

import hmac 
import hashlib 
from base64 import b16encode as b16 

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

def getSignatureKey(key, dateStamp, regionName, serviceName): 
    kDate = sign(("AWS4" + key).encode("utf-8"), dateStamp) 
    print b16(kDate) 
    kRegion = sign(kDate, regionName) 
    print b16(kRegion) 
    kService = sign(kRegion, serviceName) 
    print b16(kService) 
    kSigning = sign(kService, "aws4_request") 
    print b16(kSigning) 
    return kSigning 

key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY' 
dateStamp = '20120215' 
regionName = 'us-east-1' 
serviceName = 'iam' 

getSignatureKey(key, dateStamp, regionName, serviceName) 

Sortie

969FBB94FEB542B71EDE6F87FE4D5FA29C789342B0F407474670F0C2489E0A0D 
69DAA0209CD9C5FF5C8CED464A696FD4252E981430B10E3D3FD8E2F197D7A70C 
F72CFD46F26BC4643F06A11EABB6C0BA18780C19A8DA0C31ACE671265E3C87FA 
F4780E2D9F65FA895F9C67B32CE1BAF0B0D8A43505A000A1A9E090D414DB404D 

PHP

string hash_hmac (string $algo , string $data , string $key [, bool $raw_output = false ]) 
+0

Merci beaucoup pour votre réponse. Je suis désolé de devoir mentionner que j'utilise PHP. Je vais travailler avec la conversion de texte comme vous avez conseillé maintenant et trouver où est le problème !! – MeV

+0

Problème résolu. Incroyable. Merci encore! – MeV