使用hmac在Elixir和PHP中生成签名

6
我将尝试使用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="

或者我交换abcdef的位置。

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="

但它们中没有一个具有相同的价值。有人可以告诉我如何以正确的方式做吗?

1个回答

4

主要问题在于hash_hmac返回十六进制字符串,而:crypto.hmac返回二进制。

Elixir中的等效代码为:

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

我们需要使用 String.downcase,因为Base.encode16返回一个大写的十六进制字符串,而PHP的hash_hmac返回小写的a-f

4
查看文档后,我发现可以这样做:...|> Base.encode16(case: :lower) |> Base.encode64,无需使用 String.downcase - 王志軍

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接