Вопрос

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

Спасибо!

Это было полезно?

Решение

Следующее эквивалентно вашему 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)));"

Другие советы

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