使用 hmac 在 Elixir 和 PHP 中生成签名
Generate signature in Elixir and PHP using hmac
我尝试使用 Elixir 生成签名,其值与 PHP 相同。
例如PHP中的代码是
$signature = base64_encode(hash_hmac("sha256", "abc", "def"));
输出将是
Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==
如何在Elixir中生成具有相同值的签名。我试过类似下面的东西
iex(9)> :crypto.hmac(:sha256, "abc", "def") |> Base.encode64 │
"IOvA8JNERwE081BA9j6pix2OQUISlJ7lxQBCnRXqsIE="
iex(10)> :crypto.hash(:sha256, :crypto.hmac(:sha256, "abc", "def")) |> Base.encode64 │
"dxGiPN6KqBJrtS2wlC4tnJXwUsWf4u1LPDtDFK+VT5A="
或者我调换abc
和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="
但其中 none 个具有相同的值。谁能告诉我正确的做法?
主要问题是 hash_hmac
returns 一个十六进制字符串,而 :crypto.hmac
returns 一个二进制字符串。
Elixir 中的等效代码是:
iex(1)> :crypto.hmac(:sha256, "def", "abc") |> Base.encode16 |> String.downcase |> Base.encode64
"Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA=="
我们需要使用 String.downcase
因为 Base.encode16
returns 是一个大写的十六进制字符串 A-F
而 PHP 的 hash_hmac
returns小写a-f
.
我尝试使用 Elixir 生成签名,其值与 PHP 相同。
例如PHP中的代码是
$signature = base64_encode(hash_hmac("sha256", "abc", "def"));
输出将是
Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA==
如何在Elixir中生成具有相同值的签名。我试过类似下面的东西
iex(9)> :crypto.hmac(:sha256, "abc", "def") |> Base.encode64 │
"IOvA8JNERwE081BA9j6pix2OQUISlJ7lxQBCnRXqsIE="
iex(10)> :crypto.hash(:sha256, :crypto.hmac(:sha256, "abc", "def")) |> Base.encode64 │
"dxGiPN6KqBJrtS2wlC4tnJXwUsWf4u1LPDtDFK+VT5A="
或者我调换abc
和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="
但其中 none 个具有相同的值。谁能告诉我正确的做法?
主要问题是 hash_hmac
returns 一个十六进制字符串,而 :crypto.hmac
returns 一个二进制字符串。
Elixir 中的等效代码是:
iex(1)> :crypto.hmac(:sha256, "def", "abc") |> Base.encode16 |> String.downcase |> Base.encode64
"Mzk3ZjQ2NzM0MWU0ZDc4YzQ3NDg2N2VmMzI2MWNkYjQ2YzBlMTAzNTFlOWE5ODk5NjNlNmNiMmRjZTQwZWU1ZA=="
我们需要使用 String.downcase
因为 Base.encode16
returns 是一个大写的十六进制字符串 A-F
而 PHP 的 hash_hmac
returns小写a-f
.