Pregunta

Estoy escribiendo un pequeño programa de rubí para jugar con Twitter sobre OAuth y todavía tienen que encontrar la manera correcta de hacer el HMAC-SHA1 firma. Hasta el momento, metí la pata alrededor con

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

Pero esto salidas algo que los rechazos de Twitter, no siendo una firma válida. De hecho, me lo resolvió en el peor manera posible, por favor intento no abofetearme:

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

Este último funciona realmente y puedo ir por ahí haciendo mis cosas.

Me gustaría algunos consejos sobre cómo hacer realidad hacer esto sin volver de nuevo a PHP. No soy mucho de un ventilador de bibliotecas mientras yo estoy tratando de aprender un idioma, por lo que las gemas son más o menos fuera de la cuestión.

Gracias!

¿Fue útil?

Solución

El siguiente es equivalente a su código PHP, aunque he decidido no envuelve en una sola línea.

Estoy usando la gema rubí hmac, ya que funciona con 1.8, así como Ruby 1.9. Si está utilizando exclusivamente Ruby 1.9 Creo que el paquete de la biblioteca estándar 'digerir' ha implementado HMAC (pero esto no se encuentra en la versión 1.8 del paquete). Asegúrese 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)));"

Mejor aún, utilice el paquete OpenSSL biblioteca estándar (que la mayoría de Linux y MacOS tienen fuera de la caja). Este código funcionará sobre el Ruby 1.8 y 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)));"

Otros consejos

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top