以下相当于您的 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)));"