Подтвердить что ты не робот

Рубиновый способ создания сигнатуры HMAC-SHA1 для OAuth

Я пишу небольшую рубиновую программу, чтобы играть с Twitter над OAuth и еще не найти правильный способ сделать подпись 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. Я не являюсь поклонником библиотек, пока я пытаюсь выучить язык, поэтому камни практически не могут быть и речи.

Спасибо!

4b9b3361

Ответ 1

Следующее эквивалентно вашему PHP-коду, хотя я решил не переносить его в одну строку.

Я использую gem ruby-hmac, потому что он работает с 1.8, а также с Ruby 1.9. Если вы используете исключительно Ruby 1.9, я считаю, что в стандартном пакете "дайджест" библиотеки 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)));"

Ответ 2

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