2012-01-20 33 views
9

Tôi đang cố gắng tương tác với Hệ thống nhắn tin Web thời gian thực của bên thứ ba được tạo và duy trì bởi Pusher.com. Bây giờ, tôi không thể gửi bất cứ điều gì thông qua API trừ khi tôi tạo ra một dữ liệu của tôi là HMAC SHA256 hex digest. Một mã nguồn mẫu viết bằng ruby có thể thử để minh họa điều này:HMAC SHA256 hex tiêu hóa của một chuỗi trong Erlang, làm thế nào?

 
# 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 

Tôi đã kiểm tra erlang crypto Library và tôi thậm chí không thể tạo ra một SHA256 hex digest "trực tiếp"

Làm thế nào để tôi làm toàn bộ điều này trong Erlang? giúp đỡ ....

* CẬP NHẬT * giải pháp

Tôi đã tìm thấy ở đây: sha256 encryption in erlang và họ đã dẫn tôi đến erlsha2. Tuy nhiên, làm thế nào để tôi tạo ra HMAC của một đầu ra SHA256 hexdigest từ mô-đun này?

Trả lời

11

Với erlsha2, sử dụng sau đây để có được tương đương với mã Ruby của bạn:

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" 
+0

Tuyệt vời! Tuyệt quá ! Tuyệt quá ! Cảm ơn rất nhiều @ Steve + Vinoski –

3

Tôi chỉ cần stumbled thông qua điều này bản thân mình và cuối cùng đã quản lý nó chỉ bằng cách sử dụng mật mã, vì vậy tôi nghĩ rằng tôi sẽ chia sẻ. Đối với việc sử dụng của bạn tôi nghĩ rằng bạn sẽ muốn:

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

Phần HMAC nên chăm sóc tiêu hóa + HMAC và sau đó đường ống để mã hóa 16 nên cung cấp phần hex. Tôi tưởng tượng bạn có thể di chuyển một thời gian trước đây, nhưng kể từ khi tôi chỉ có cùng một vấn đề và muốn thử và tìm ra nó trong những thứ stdlib tôi nghĩ rằng tôi sẽ chia sẻ.