28

私はOAuthを介してTwitterで遊ぶための小さなルビープログラムを書いていますが、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に戻らずに実際にこれを行う方法についていくつかのヒントが欲しいです。言語を学ぼうとしている間、私は図書館のファンではないので、宝石はほとんど問題外です。

ありがとう!

4

2 に答える 2

45

以下はPHPコードと同等ですが、1行でラップしないことを選択しました。

私はgemruby-hmacを使用しています。これは、Ruby1.9だけでなく1.8でも動作するためです。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には標準で用意されています)を使用してください。このコードはRuby1.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)));"
于 2011-01-24T08:36:58.967 に答える
8
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
于 2014-03-29T02:45:05.733 に答える