Erlang 中字符串的 HMAC SHA256 十六进制摘要,怎么样?

发布于 2024-12-28 02:28:30 字数 1302 浏览 3 评论 0 原文

我正在尝试与 Pusher.com 创建和维护的第三方实时网络消息传递系统进行交互b>.现在,我无法通过 API 发送任何内容,除非我生成数据的 HMAC SHA256 十六进制摘要。用 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 十六进制摘要

我如何在 Erlang 中完成这一切?帮助....

* 更新 *

我在这里找到了解决方案: erlang 中的 sha256 加密 他们引导我erlsha2。但是,我如何从此模块生成 SHA256 hexdigest 输出的 HMAC

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 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

暗地喜欢 2025-01-04 02:28:30

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

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"
小梨窩很甜 2025-01-04 02:28:30

我自己偶然发现了这个问题,最后仅使用加密技术就成功了,所以我想分享一下。对于您的使用,我认为您需要:

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

hmac 部分应处理摘要 + hmac,然后通过管道编码 16 应提供十六进制部分。我想你可能不久前就离开了,但由于我也遇到了同样的问题,并且想尝试在 stdlib 中解决它,我想我会分享。

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.

寄风 2025-01-04 02:28:30

同一个项目(erlsha2)有一个用于此目的的模块:

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

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

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

少跟Wǒ拽 2025-01-04 02:28:30

如果您使用Elixir,您可以使用

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

If you're using Elixir, you can use

:crypto.hash(:sha256, [secret, string_to_sign]) 
|> Base.encode16 
|> String.downcase
一萌ing 2025-01-04 02:28:30

这是一个单行代码(Erlang 24):

[begin if N < 10 -> 48 + N; true -> 87 + N end end ||
            <<N:4>> <= crypto:mac(hmac, sha256, Secret1, StringToSign1)].

>>> "309fc4be20f04e53e011b00744642d3fe66c2c7c5686f35ed6cd2af6f202e445"

不需要外部库。

This is a one-liner (Erlang 24):

[begin if N < 10 -> 48 + N; true -> 87 + N end end ||
            <<N:4>> <= crypto:mac(hmac, sha256, Secret1, StringToSign1)].

>>> "309fc4be20f04e53e011b00744642d3fe66c2c7c5686f35ed6cd2af6f202e445"

No need for external libs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文