2015-09-16 11 views
5

Provo a generare una firma usando Elixir, che ha lo stesso valore di PHP.Genera firma in Elixir e PHP usando hmac

Per esempio il codice in PHP è

$signature = base64_encode(hash_hmac("sha256", "abc", "def")); 

e l'uscita sarà

Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==

Come devo generare la firma che ha lo stesso valore in Elixir. Ho provato qualcosa di simile sotto

iex(9)> :crypto.hmac(:sha256, "abc", "def") |> Base.encode64       │ 
"IOvA8JNERwE081BA9j6pix2OQUISlJ7lxQBCnRXqsIE=" 

iex(10)> :crypto.hash(:sha256, :crypto.hmac(:sha256, "abc", "def")) |> Base.encode64 │ 
"dxGiPN6KqBJrtS2wlC4tnJXwUsWf4u1LPDtDFK+VT5A=" 

o io cambiare la posizione di abc e def

iex(11)> :crypto.hash(:sha256, :crypto.hmac(:sha256, "def", "abc")) |> Base.encode64 │ 
"b+3P5oHu8e6HIlJe2MzcGhKm7tCcF/NE5wPIbEhrFGU=" 

iex(12)> :crypto.hmac(:sha256, "def", "abc") |> Base.encode64       │ 
"OX9Gc0Hk14xHSGfvMmHNtGwOEDUempiZY+bLLc5A7l0=" 

Ma nessuno di loro ha lo stesso valore. Qualcuno può dirmi come farlo nel modo giusto?

risposta

4

Il problema principale è che hash_hmac restituisce una stringa esadecimale, mentre :crypto.hmac restituisce un binario.

Il codice equivalente in Elixir è:

iex(1)> :crypto.hmac(:sha256, "def", "abc") |> Base.encode16 |> String.downcase |> Base.encode64 
"Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==" 

Abbiamo bisogno di utilizzare String.downcase perchè Base.encode16 restituisce una stringa esadecimale a capitale A-F mentre il PHP hash_hmac rendimenti minuscole a-f.

+0

Grazie mille! Ha funzionato!!! –

+3

Dopo aver controllato il documento, ho scoperto che posso farlo come '... |> Base.encode16 (caso:: lower) |> Base.encode64' senza' String.downcase' –