Estoy intentando obtener una implementación basada en la API de solicitud http firmada por AWS para que funcione entre Erlang y PHP. Pero no puedo hacerlo funcionar.
El enfoque central es que usted construyó una versión canónica de una solicitud http y la firma con una clave secreta y adjunta esa firma a los encabezados.
En el lado de Erlang, estoy usando crypto:sha/
que devuelve una firma de 160 bits / 20 bytes, por lo que creo que es SHA1
En el lado de php estoy usando hash_hmac/3
con el sha1
algo.
El código y la salida de Erlang tienen este aspecto:
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)).
dando salida de
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="
El código de firma de PHP es:
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);
}
Dar salida de
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=
Esta implementación php devuelve 160 bits / 20 bytes, por lo que creo que debería coincidir con crypto:sha
de erlang, pero podría estar hablando mince ...
Sospecho (por experiencia previa) que hay una discrepancia entre lo que creo que hash_hmac
está haciendo y lo que realmente es.