2015-09-16 12 views
5

Próbuję wygenerować podpis za pomocą Elixir, który ma tę samą wartość, co PHP.Generowanie podpisu w Elixir i PHP przy użyciu hmaca

Na przykład kodu w PHP jest

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

i wyjście będzie

Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==

Jak należy wygenerować podpis, który ma taką samą wartość w Elixir. Próbowałem coś jak poniżej

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

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

lub przełączyć pozycję abc i 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=" 

Ale żaden z nich ma taką samą wartość. Czy ktoś może mi powiedzieć, jak to zrobić we właściwy sposób?

Odpowiedz

4

Głównym problemem jest to, że hash_hmac zwraca ciąg szesnastkowy, podczas gdy :crypto.hmac zwraca plik binarny.

Odpowiednik kodu w Elixir jest:

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

Musimy wykorzystać String.downcase ponieważ Base.encode16 Zwraca ciąg znaków hex z kapitałem A-F podczas PHP hash_hmac powraca niższe przypadków a-f.

+0

Dziękuję bardzo! Zadziałało!!! –

+3

Po sprawdzeniu dokumentu, dowiedziałem się, że mogę zrobić to jak '... |> Base.encode16 (case:: lower) |> Base.encode64' bez' String.downcase' –

Powiązane problemy