【问题标题】:Generate signature in Elixir and PHP using hmac使用 hmac 在 Elixir 和 PHP 中生成签名
【发布时间】:2015-09-16 15:40:04
【问题描述】:

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

但它们都没有相同的价值。谁能告诉我正确的做法?

【问题讨论】:

    标签: php elixir hmac


    【解决方案1】:

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

    Elixir 中的等效代码为:

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

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

    【讨论】:

    • 查看文档后,我发现不用String.downcase也可以像...|> Base.encode16(case: :lower) |> Base.encode64 那样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多