HMAC SHA256 шестнадцатеричный дайджест строки в Erlang, как?

Я пытаюсь взаимодействовать со сторонней системой обмена сообщениями в Интернете в реальном времени, созданной и поддерживаемой Pusher.com . Теперь я не могу ничего отправлять через API, если не создаю HMAC SHA256 hex digest своих данных. Пример исходного кода, написанный на ruby, можно попытаться проиллюстрировать:

# Dependencies
# gem install ruby-hmac
#
require 'rubygems'
require 'hmac-sha2'

secret = '7ad3773142a6692b25b8'
string_to_sign = "POST\n/apps/3/channels/test_channel/events\nauth_key=278d425bdf160c739803&auth_timestamp=1272044395&auth_version=1.0&body_md5=7b3d404f5cde4a0b9b8fb4789a0098cb&name=foo"

hmac = HMAC::SHA256.hexdigest(secret, string_to_sign)

puts hmac
# >> 309fc4be20f04e53e011b00744642d3fe66c2c7c5686f35ed6cd2af6f202e445

Я проверил крипто-библиотеку Erlang и я даже не могу создать SHA256 hex digest "напрямую"

Как мне сделать все это в Erlang? помощь ....

* ОБНОВЛЕНИЕ *

Я нашел решение здесь: шифрование sha256 в erlang, и они привели меня к erlsha2 . Но все же, как мне сгенерировать HMAC из SHA256 hexdigest вывода из этого модуля?


person Muzaaya Joshua    schedule 20.01.2012    source источник


Ответы (4)


С помощью erlsha2 используйте следующее, чтобы получить эквивалент своего кода Ruby:

1> hmac:hexlify(hmac:hmac256(<<"7ad3773142a6692b25b8">>, <<"POST\n/apps/3/channels/test_channel/events\nauth_key=278d425bdf160c739803&auth_timestamp=1272044395&auth_version=1.0&body_md5=7b3d404f5cde4a0b9b8fb4789a0098cb&name=foo">>)).
"309FC4BE20F04E53E011B00744642D3FE66C2C7C5686F35ED6CD2AF6F202E445"
person Steve Vinoski    schedule 21.01.2012
comment
Большой! Большой ! Большой ! Большое спасибо @ Steve + Vinoski - person Muzaaya Joshua; 21.01.2012

Я просто наткнулся на это сам и, наконец, справился с этим, просто используя криптовалюту, поэтому подумал, что поделюсь. Для вашего использования, я думаю, вам нужно:

:crypto.hmac(:sha256, secret, string_to_sign) |> Base.encode16

Часть hmac должна позаботиться о дайджесте + hmac, а затем конвейер для кодирования 16 должен предоставить шестнадцатеричную часть. Я предполагаю, что вы, вероятно, переехали некоторое время назад, но, поскольку у меня была такая же проблема, и я хотел попытаться выяснить ее в материале stdlib, я подумал, что поделюсь.

person geemus    schedule 19.11.2014

В том же проекте (erlsha2) есть модуль для этого:

https://github.com/vinoski/erlsha2/blob/master/src/hmac.erl

person gleber    schedule 20.01.2012
comment
Я посмотрел на это, но мне нужен образец источника, дающий те же результаты, что и приведенный выше код ruby. Спасибо @gleber - person Muzaaya Joshua; 20.01.2012

Если вы используете Эликсир, вы можете использовать

:crypto.hash(:sha256, [secret, string_to_sign]) 
|> Base.encode16 
|> String.downcase
person punkrockpolly    schedule 18.05.2021