Lograr que hmac_sha funcione entre Erlang y PHP

1

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.

    
pregunta Gordon Guthrie 17.02.2013 - 23:54
fuente

1 respuesta

0

Es un problema de cadena: resulta que las cadenas entre comillas simples y las cadenas entre comillas dobles no son lo mismo en PHP.

Aquí hay alguna información relevante: enlace

tl; dr; Estaba usando cadenas entre comillas simples: cuando fui a las comillas dobles, funcionó.

    
respondido por el Gordon Guthrie 20.02.2013 - 09:06
fuente

Lea otras preguntas en las etiquetas