Генерация подписи в Elixir и PHP с использованием 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="

Но ни один из них не имеет такой же ценности. Может кто-нибудь сказать мне, как это сделать правильно?

5

Решение

Основная проблема заключается в том, что hash_hmac возвращает шестнадцатеричную строку, в то время как :crypto.hmac возвращает двоичный файл

Эквивалентный код в эликсире:

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,

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]