Ottenere hmac_sha per lavorare tra Erlang e PHP

1

Sto cercando di ottenere un'implementazione basata sull'API di richiesta http firmata da AWS per lavorare tra Erlang e PHP. Ma non riesco a farlo funzionare.

L'approccio di base è che hai costruito una versione canonica di una richiesta http e la firma con una chiave segreta e alleghi quella firma alle intestazioni.

Sul lato Erlang sto usando crypto:sha/ che restituisce una firma a 160 bit / 20 byte - quindi penso che sia SHA1

Sul lato ph sto usando hash_hmac/3 con sha1 algo.

Il codice e l'output di Erlang assomiglia a questo:

sign2(PrivateKey, Str) ->
    io:format("Str is ~p~n", [Str]),
    Sign = xmerl_ucs:to_utf8(Str),
    io:format("Sign is ~p~n", [Sign]),
    Hash = crypto:sha_mac(PrivateKey, Sign),
    io:format("Hash is ~p~n", [Hash]),
    binary_to_list(base64:encode(Hash)).

dare l'output di

Hash is <<147,121,203,238,1,247,248,246,157,133,49,21,159,146,41,243,124,101,99,57>>
B64 is "k3nL7gH3+PadhTEVn5Ip83xlYzk="

Il codice di firma di PHP è:

public function sign2($privateKey, $str) {
    echo "privateKey is " . $privateKey . "\nstring is " . $str . "\n";
    $hash = hash_hmac('sha1', $str, $privateKey, true);
    $this->dump("hash ", $hash);
    return base64_encode($hash);
}

Fornire output di

privateKey is uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o
string is DELETE\n\n\n\nx-amz-date:Tue, 27 Mar 2007 21:20:26 +0000\n/johnsmith/photos/puppy.jpg
hash :217 254 129 103 14 29 63 36 176 253 241 183 51 111 120 22 117 125 167 104 
Test hash_test1 fails expected: k3nL7gH3+PadhTEVn5Ip83xlYzk= got 2f6BZw4dPySw/fG3M294FnV9p2g=

Questa implementazione di php restituisce 160 bit / 20 byte ed è per questo che penso che dovrebbe corrispondere a crypto:sha di erlang - ma potrei parlare di tritare ...

Sospetto (per esperienza precedente) che ci sia una discrepanza tra ciò che penso che hash_hmac stia facendo e che cosa sia in realtà.

    
posta Gordon Guthrie 17.02.2013 - 23:54
fonte

1 risposta

0

È un problema con le stringhe: le stringhe tra virgolette singole e le stringhe con doppie virgolette non sono le stesse in ogni caso in PHP.

Ecco alcune informazioni rilevanti: link

tl; dr; Stavo usando singole stringhe tra virgolette - quando sono andato a fare il doppio delle citazioni ha funzionato.

    
risposta data 20.02.2013 - 09:06
fonte

Leggi altre domande sui tag