web-dev-qa-db-ja.com

Ruby OAuthのHMAC-SHA1署名を生成する方法

私は小さな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に戻さずに実際にこれを行う方法のヒントを教えてください。言語を学ぼうとしている間、私はライブラリのファンではないので、宝石はほとんど問題外です。

ありがとう!

28
Roberto

次のコードはPHPコードと同じですが、1行にまとめないようにしました。

私は、Ruby-hmacというgemを使用しています。これは、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)));"
40
Ronen Botzer
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
6
ipegasus