2015-09-16 4 views
5

Ich versuche, eine Signatur mit Elixir zu generieren, die einen gleichen Wert wie PHP hat.Signatur in Elixir und PHP generieren mit hmac

Zum Beispiel der Code in PHP ist

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

und der Ausgang wird

Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==

Wie soll ich die Unterschrift erzeugen, die denselben Wert in Elixir hat. Ich habe versucht, so etwas wie unten

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

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

oder schalte ich die Position von abc und 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=" 

Aber keiner von ihnen hat den gleichen Wert. Kann mir jemand sagen, wie man es richtig macht?

Antwort

4

Das Hauptproblem ist, dass hash_hmac eine Hex-Zeichenfolge zurückgibt, während :crypto.hmac eine Binärdatei zurückgibt.

Der entsprechende Code in Elixir ist:

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

Wir müssen mit Kapital String.downcase weil Base.encode16 liefert einen Hex-String verwenden A-F während PHP hash_hmac kehrt Kleinbuchstaben a-f.

+0

Vielen Dank! Es funktionierte!!! –

+3

Nach dem Auschecken des Dokuments, fand ich heraus, ich kann es tun, wie '... |> Base.encode16 (Fall:: niedriger) |> Base.encode64' ohne' String.downcase' –