红宝石生成oauth的HMAC-SHA1签名的方法
-
28-09-2019 - |
题
我正在编写一个小型红宝石程序,可以在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
不隶属于 StackOverflow