HMAC SHA256 hex digest of a string in Erlang, how?

2020-03-13 04:11发布

I am trying to interact with third party real time Web messaging System created and maintained by Pusher.com. Now, i cannot send anything through the API unless i produce an HMAC SHA256 hex digest of my data. A sample source code written in ruby could try to illustrate this:

# 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

I checked the erlang crypto Library and i cannot even generate a SHA256 hex digest "directly"

How do i do this whole thing in Erlang ? help....

* UPDATE *

I have found solutions here: sha256 encryption in erlang and they have led me to erlsha2. But still, how do i generate the HMAC of a SHA256 hexdigest output from this module ?

3条回答
女痞
2楼-- · 2020-03-13 04:21

The same project (erlsha2) has a module for this:

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

查看更多
闹够了就滚
3楼-- · 2020-03-13 04:22

I just stumbled through this myself and finally managed it just using crypto, so thought I would share. For your usage I think you would want:

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

The hmac portion should take care of digest + hmac and then piping to encode 16 should provide the hex part. I imagine you probably moved on some time ago, but since I just had the same issue and wanted to try and figure it out in stdlib stuff I thought I would share.

查看更多
放荡不羁爱自由
4楼-- · 2020-03-13 04:26

With erlsha2, use the following to get the equivalent of your Ruby code:

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"
查看更多
登录 后发表回答