在Erlang中如何对字符串进行HMAC SHA256十六进制摘要?

12

我正在尝试与由Pusher.com创建和维护的第三方实时Web消息系统进行交互。现在,除非我生成我的数据的HMAC SHA256十六进制摘要,否则我无法通过API发送任何内容。下面是用ruby编写的示例源代码:

# 依赖项
# 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 crypto库,但是我甚至无法直接生成SHA256十六进制摘要

在Erlang中如何完成这个任务? 求助....

* 更新 *

我在这里找到了解决方案:在Erlang中进行sha256加密,并且它们引导我使用erlsha2。但是,我该如何从此模块生成HMACSHA256十六进制摘要输出?
5个回答

11

使用 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"

太棒了!太棒了!太棒了!非常感谢@Steve+Vinoski - Muzaaya Joshua

6

我自己也曾经遇到这个问题,最终成功使用crypto解决了它,所以我想分享一下。根据您的需求,我认为您需要:

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

hmac部分应该已经处理了摘要和hmac,然后通过编码16进行转换为十六进制。我想您可能早就解决了这个问题,但是考虑到我最近遇到了同样的问题并且想尝试在stdlib中找到答案,所以我想分享一下。


3

我已经看过了,但我需要生成与上面的Ruby代码相同结果的示例源代码。谢谢@gleber - Muzaaya Joshua

2
如果您正在使用Elixir,您可以使用以下内容:
:crypto.hash(:sha256, [secret, string_to_sign]) 
|> Base.encode16 
|> String.downcase

0
这是一行代码(Erlang 24):
[begin if N < 10 -> 48 + N; true -> 87 + N end end ||
            <<N:4>> <= crypto:mac(hmac, sha256, Secret1, StringToSign1)].

>>> "309fc4be20f04e53e011b00744642d3fe66c2c7c5686f35ed6cd2af6f202e445"

不需要外部库。


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