Ruby方式为OAuth生成HMAC-SHA1签名

Rob*_*rto 28 ruby cryptography sha1 twitter-oauth

我正在编写一个小型ruby程序,用于在OAuth上使用Twitter,并且还没有找到正确的方法来执行HMAC-SHA1签名.到目前为止,我搞砸了

Base64.encode64(OpenSSL::HMAC.hexdigest(digest, key, stuff)).chomp
Run Code Online (Sandbox Code Playgroud)

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

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

这最后一个实际上有效,我可以四处寻找我的东西.

我想要一些关于如何在不回复PHP的情况下实际执行此操作的提示.当我试图学习一门语言时,我不是很喜欢图书馆,所以宝石几乎是不可能的.

谢谢!

Ron*_*zer 41

以下等同于您的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)));"
Run Code Online (Sandbox Code Playgroud)

更好的是,使用标准库包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)));"
Run Code Online (Sandbox Code Playgroud)

  • 此外,如果你想在PHP中执行与hash_hmac('sha1',key,signature,false)`相同的操作,那么执行`OpenSSL :: HMAC.hexdigest('sha1',key,signature)` (8认同)

ipe*_*sus 7

def hmac_sha1(data, secret=HOST_KEY)
    require 'base64'
    require 'cgi'
    require 'openssl'
    hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new('sha1'), secret.encode("ASCII"), data.encode("ASCII"))
    return hmac
end
Run Code Online (Sandbox Code Playgroud)

  • 如果你也在寻找一个基于rails的解决方案,你可以使用这个人的@ipegasus答案,然后从该行复制`hmac = ...`之后的所有内容(不需要和返回就是我所说的) .可能他也可以编辑,而不是将他的答案变为bogart. (2认同)