为 OAuth 生成 HMAC-SHA1 签名的 Ruby 方法

标签 ruby cryptography twitter-oauth sha1

我正在编写一个小的 ruby​​ 程序来通过 OAuth 与 Twitter 一起玩,但还没有找到一个正确的方法来进行 HMAC-SHA1 签名。到目前为止,我搞砸了

Base64.encode64(OpenSSL::HMAC.hexdigest(digest, key, stuff)).chomp

但这会输出 Twitter 拒绝的内容,而不是有效签名。我实际上以更糟糕的方式解决了它,请不要打我耳光:

php -r "echo rawurlencode(base64_encode(hash_hmac('sha1', '#{@signature}', '#{llave}', true)));"

最后一个确实有效,我可以四处做我的事情。

我想要一些关于如何在不返回到 PHP 的情况下实际执行此操作的提示。在尝试学习一门语言时,我不太喜欢图书馆,所以 gems 几乎是不可能的。

谢谢!

最佳答案

以下等同于您的 PHP 代码,但我选择不将其包装在一行中。

我正在使用 gem ruby​​-hmac,因为它适用于 1.8 和 Ruby 1.9。如果您只使用 Ruby 1.9,我相信标准库包“digest”已经实现了 HMAC(但是 1.8 版本的包中没有)。确保 gem install ruby​​-hmac

require 'rubygems'
require 'base64'
require 'cgi'
require 'hmac-sha1'

key = '1234'
signature = 'abcdef'
hmac = HMAC::SHA1.new(key)
hmac.update(signature)
puts CGI.escape(Base64.encode64("#{hmac.digest}\n"))

# equivalent to:
# php -r "echo rawurlencode(base64_encode(hash_hmac('sha1', 'abcdef', '1234', true)));"

更好的是,使用标准库包 OpenSSL(大多数 Linux 和 MacOS 都有现成的)。此代码适用于 Ruby 1.8 和 1.9:

require 'base64'
require 'cgi'
require 'openssl'

key = '1234'
signature = 'abcdef'
puts CGI.escape(Base64.encode64("#{OpenSSL::HMAC.digest('sha1',key, signature)}\n"))

# equivalent to:
# php -r "echo rawurlencode(base64_encode(hash_hmac('sha1', 'abcdef', '1234', true)));"

关于为 OAuth 生成 HMAC-SHA1 签名的 Ruby 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084979/

相关文章:

ruby - cucumber 步骤定义正则表达式排除

ruby - send( :method_name) and method(:method_name). 调用之间有区别吗?

ruby - 了解 ruby 范围

javascript - crypto-js aes 无法解密它加密的内容

ios - 如何获取推文 ID ....?我正在通过 fabric 使用 Twitter SDK

blackberry - Blackberry Twitter Integration 推特照片

ruby-on-rails - 在 Rails 3 haml View 中设计的命名路线

javascript - pbkdf2 返回一个包含 128 个字符而不是 64 个字符的散列

c++ - 我可以通过重新播种结合 random_device 和 mt19937 生成加密安全随机数据吗?

facebook - 处理存在的用户,但尝试通过 Facebook OAuth/etc 登录