Signing in Elixir and PHP using hmac

I am trying to generate a signature using Elixir, which has the same meaning as PHP.

For example, code in PHP

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

and the output will be

Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==

How to create a signature that has the same meaning in Elixir. I tried something like below

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

or i switch the position of abc and 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=" 

But not one of them has the same meaning. Can someone tell me how to do it right?

+5
source share
1 answer

The main problem is that hash_hmac returns the sixth line, and :crypto.hmac returns a binary file.

Equixir equivalent code:

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

We need to use String.downcase because Base.encode16 returns a hexadecimal string with capital AF , and PHP hash_hmac returns string AF .

+4
source

All Articles