Рубиновый способ создания подписи HMAC-SHA1 для OAuth - PullRequest
26 голосов
/ 03 ноября 2010

Я пишу небольшую рубиновую программу, чтобы поиграть с Twitter через OAuth и пока не нашла правильный способ сделать подпись HMAC-SHA1 .До сих пор я возился с

Base64.encode64(OpenSSL::HMAC.hexdigest(digest, key, stuff)).chomp

Но это выдает то, что Твиттер отвергает, не являясь действительной подписью.Я на самом деле решил это самым худшим способом, пожалуйста, постарайся не шлепать меня:

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

Этот последний действительно работает, и я могу делать свои вещи.несколько советов о том, как на самом деле сделать это, не возвращаясь к PHP.Я не большой поклонник библиотек, пока пытаюсь выучить язык, поэтому о гемах почти не может быть и речи.

Спасибо!

Ответы [ 2 ]

40 голосов
/ 24 января 2011

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

Я использую гем 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)));"
6 голосов
/ 29 марта 2014
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
...