Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP / AWS] - Berekenen HMAC-SHA1

Pagina: 1
Acties:

Onderwerpen


  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 30-10 14:12
Hoi,

Om gebruik te maken van de API van AWS moet bij iedere request een authenticatie-string worden meegestuurd. En het lukt me maar niet om die juist te berekenen. Gelukking geeft Amazon in de manual een duidelijk voorbeeld, dus ik heb even al mn code teruggebracht tot het simpele voorbeeld (bron)

code:
1
2
3
String: Thu, 14 Aug 2008 17:08:48 GMT
Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
Base64 encoded signature: 4cP3hCesdCQJ1jP11111YSu0g=EXAMPLE


Simpel gezegd: Als je de string utf8-encode en vervolgens HMAC-SHA1-hasht met de secret access key als sleutel en dit geheel base64-encode dan zou de signature uit het voorbeeld hierboven moeten verschijnen. Klinkt simpel toch???

Mijn code:
PHP:
1
echo base64_encode(hash_hmac("sha1", utf8_encode("Thu, 14 Aug 2008 17:08:48 GMT"), "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", true));


Geeft een compleet andere string. Op php.net staat in de comments for some reason een eigen-gebrouwde hmac-sha1 functie. Goed, ik ben geen encryptie-deskundige dus die ook maar even getest:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
echo base64_encode(hmac_sha1(utf8_encode("Thu, 14 Aug 2008 17:08:48 GMT"), "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", true));

function hmac_sha1($data, $key){

    #adjust key to exactly 64 bytes
    if (strlen($key) > 64) { $key = str_pad(sha1($key, true), 64, chr(0)); }
    if (strlen($key) < 64) { $key = str_pad($key, 64, chr(0)); }

    #outer and inner pad
    $opad = str_repeat(chr(0x5C), 64);
    $hostnamead = str_repeat(chr(0x36), 64);

    #xor key with opad & ipad
    for ($i = 0; $i < strlen($key); $i++) {
        $opad[$i] = $opad[$i] ^ $key[$i];
        $hostnamead[$i] = $hostnamead[$i] ^ $key[$i];
    }

    #return
    return sha1( $opad . sha1($hostnamead.$data, true));

}


Geeft een weer een andere code (ook een andere dan in poging 1). Iemand enig idee hoe ik dit goed kan implementeren?

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Weet je zeker dat je nog een UTF-8 encode op die string moet doen?
Wat is het resultaat als je zonder die UTF-8 encode de HMAC berekend?

edit:
hold up.

Ik heb wat dingen getest:

C#:
1
2
3
4
5
6
7
8
9
        static void Main(string[] args)
        {
            var hmac = HMAC.Create("HMACSHA1");
            hmac.Initialize();
            hmac.Key = Encoding.UTF8.GetBytes("wJalrXUtnFEMI/K7MDENG/bPxRfiCYz");
            var input = Encoding.UTF8.GetBytes("Thu, 14 Aug 2008 17:08:48 GMT");
            var output = hmac.ComputeHash(input);
            Console.WriteLine(Convert.ToBase64String(output));
        }


de key heb ik gevarieerd, en dat leidt tot deze output:
Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYz
Output: aaF2cCP5PgMBxZsHVGGXUzpjEx8=

Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
Output: XUz7bUY0hntFYrXjmEncW6FJQ+U=

Misschien helpt dit je verder

[ Voor 73% gewijzigd door HMS op 20-02-2012 18:14 ]


  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 24-11 14:08
Ik heb eens voor je zitten kijken, maar ook ik krijg de Signature uit het voorbeeld niet nagemaakt. Ik denk dat dit komt doordat ik iets niet goed heb ingevoerd doordat ik de datum niet goed heb ingevoerd (heb niet veel in code zitten klooien om het werkend te krijgen).

Ik heb eventjes voor je op internet zitten zoeken, en ben deze pagina tegengekomen: Amazon Webservices Authentication.
Volgens deze pagina moet je je date in dit formaat hebben: yyyy-MM-ddTHH:mm:ss.fffZ
Ook heb ik op internet een class gevonden voor de authenticatie bij amazon, waarin ze dit voor de datum gebruiken:
PHP:
1
2
3
<?php
gmdate("Y-m-d\TH:i:s\Z");
?>


Ook vraag ik me af of het gedeelte "EXAMPLEKEY" in je secret access key wel erbij hoort.

Misschien dat je het kunt proberen met je eigen keys. Ik verwacht dat je het dan wel werkend krijgt op deze manier.

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 30-10 14:12
Robbiedobbie schreef op maandag 20 februari 2012 @ 18:13:
Ik heb eens voor je zitten kijken, maar ook ik krijg de Signature uit het voorbeeld niet nagemaakt. Ik denk dat dit komt doordat ik iets niet goed heb ingevoerd doordat ik de datum niet goed heb ingevoerd (heb niet veel in code zitten klooien om het werkend te krijgen).

Ik heb eventjes voor je op internet zitten zoeken, en ben deze pagina tegengekomen: Amazon Webservices Authentication.
Volgens deze pagina moet je je date in dit formaat hebben: yyyy-MM-ddTHH:mm:ss.fffZ
Ook heb ik op internet een class gevonden voor de authenticatie bij amazon, waarin ze dit voor de datum gebruiken:
PHP:
1
2
3
<?php
gmdate("Y-m-d\TH:i:s\Z");
?>


Ook vraag ik me af of het gedeelte "EXAMPLEKEY" in je secret access key wel erbij hoort.

Misschien dat je het kunt proberen met je eigen keys. Ik verwacht dat je het dan wel werkend krijgt op deze manier.
Met mijn eigen keys krijg ik het niet werkend. Dat was het begin van deze zoektocht. ook zonder "EXAMPLEKEY" krijg ik niet de juiste code tevoorschijn. En de authenticatie-info die je noemt slaat op REST-requests (en die werken anders dan het posten van XML-bestanden, wat ik wil doen).

Heb ook al meer dan een week een bericht op het developer-forum van AWS geplaatst, tot nu toe zonder reacties ;(

kan me toch ook niet voorstellen dat ze zo stom zijn om een verkeerd voorbeeld in de docs te plaatsen???

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 30-10 14:12
HMS schreef op maandag 20 februari 2012 @ 18:05:
Weet je zeker dat je nog een UTF-8 encode op die string moet doen?
ja
HMS schreef op maandag 20 februari 2012 @ 18:05:
Wat is het resultaat als je zonder die UTF-8 encode de HMAC berekend?
Maakt niet uit, als ik utf8 weglaat krijg ik exact hetzelfde (incorrecte) resultaat.
HMS schreef op maandag 20 februari 2012 @ 18:05:
Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
Output: XUz7bUY0hntFYrXjmEncW6FJQ+U=
Ja die krijg ik dus ook.

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 30-10 14:12
Hoe het afliep: Bericht gekregen van AWS dat er een fout in de documentatie zit die zsm wordt gefixt. Iedereen bedankt, we zijn toch niet gek!!! :)
Pagina: 1