我正在编写一个小型红宝石程序,可以在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。当我试图学习一种语言时,我不喜欢图书馆,所以宝石几乎是不可能的。

谢谢!

有帮助吗?

解决方案

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

我正在使用宝石红宝石,因为它可与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)));"

其他提示

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top