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à.