Question

Je vous écris un petit programme rubis à jouer avec Twitter sur OAuth et doivent encore trouver une bonne façon de faire le HMAC-SHA1 signature. Jusqu'à présent, je foiré autour avec

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

Mais cette sortie quelque chose qui rejette Twitter, ne pas être une signature valide. En fait, je résolu dans la pire façon possible, s'il vous plaît essayer de ne pas me gifler:

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

Ce dernier fonctionne réellement et je peux faire le tour de faire mes affaires.

Je voudrais quelques conseils sur la façon de faire réellement faire cela sans revenir en arrière à PHP. Je ne suis pas un grand fan des bibliothèques pendant que je suis en train d'apprendre une langue, donc les pierres précieuses sont à peu près hors de question.

Merci!

Était-ce utile?

La solution

Ce qui suit est équivalent à votre code PHP, bien que je choisi de ne pas l'envelopper dans une seule ligne.

J'utilise le bijou rubis-HMAC, car il fonctionne avec 1,8, ainsi que Ruby 1.9. Si vous êtes exclusivement en utilisant Ruby 1.9 Je crois que le package de la bibliothèque standard « digest » a HMAC mis en œuvre (mais cela manque dans la version 1.8 du paquet). Assurez-vous de 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)));"

Mieux encore, utilisez le OpenSSL package bibliothèque standard (dont la plupart Linux et Mac OS ont de la boîte). Ce code fonctionne sur Ruby 1.8 et 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)));"

Autres conseils

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top