Skip to content

Instantly share code, notes, and snippets.

@phiggins
Created December 14, 2010 01:16
Show Gist options
  • Save phiggins/739873 to your computer and use it in GitHub Desktop.
Save phiggins/739873 to your computer and use it in GitHub Desktop.
# encoding: utf-8
require 'hmac'
require 'hmac-sha2'
require 'base64'
require 'openssl'
class Sns
class AwsCredentials
attr_reader :access_key, :host
def initialize(access_key, secret_key, region)
@access_key, @secret_key = access_key, secret_key
@host = "sns.#{region}.amazonaws.com"
end
def sign(query_string, path='/', method='GET')
hmac = HMAC::SHA256.new(@secret_key)
hmac.update([method, @host, path, query_string].join("\n"))
Base64.encode64(hmac.digest).chomp
end
def sign_with_openssl(query_string, path='/', method='GET')
digest = OpenSSL::HMAC.new(@secret_key, OpenSSL::Digest::SHA256.new)
digest.update([method, @host, path, query_string].join("\n"))
Base64.encode64(digest.digest).chomp
end
end
end
n = (ARGV.first || 10_000).to_i
access_key = 'access_key'
secret_key = 'secret_key'
region = 'region'
messages = ["", "0123456789ABCDEF", "A" * 1000]
messages.each do |m|
puts "original:\t" +
Sns::AwsCredentials.new(access_key, secret_key, region).sign(m)
puts "new:\t\t" +
Sns::AwsCredentials.new(access_key, secret_key, region).sign_with_openssl(m)
puts
end
require 'benchmark'
Benchmark.bmbm do |b|
b.report("ruby-hmac w/new") do
n.times do
messages.each do |m|
Sns::AwsCredentials.new(access_key, secret_key, region).sign(m)
end
end
end
b.report("openssl w/new") do
n.times do
messages.each do |m|
Sns::AwsCredentials.new(access_key, secret_key, region).sign_with_openssl(m)
end
end
end
b.report("ruby-hmac") do
creds = Sns::AwsCredentials.new(access_key, secret_key, region)
n.times do
messages.each do |m|
creds.sign(m)
end
end
end
b.report("openssl") do
creds = Sns::AwsCredentials.new(access_key, secret_key, region)
n.times do
messages.each do |m|
creds.sign_with_openssl(m)
end
end
end
b.report("nil") do
n.times do
messages.each do |m|
nil
end
end
end
end
@phiggins
Copy link
Author

$ ruby -v rubyhmac_vs_openssl.rb 
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-linux]
original:   TUsp/uSjoTIV2TmovwYCYdNouagB5IsIR5PxW8x/3fg=
new:        TUsp/uSjoTIV2TmovwYCYdNouagB5IsIR5PxW8x/3fg=

original:   tn+20OWt+StLig0pKaOiIMAiea1tQYd9d2DNCKJIKfI=
new:        tn+20OWt+StLig0pKaOiIMAiea1tQYd9d2DNCKJIKfI=

original:   hagnKGSsPTkgz0Ms/zUkycB62MBaJvauuzURvZhXdNg=
new:        hagnKGSsPTkgz0Ms/zUkycB62MBaJvauuzURvZhXdNg=

Rehearsal ---------------------------------------------------
ruby-hmac w/new   1.070000   0.010000   1.080000 (  1.099015)
openssl w/new     0.440000   0.000000   0.440000 (  0.443124)
ruby-hmac         1.040000   0.000000   1.040000 (  1.038259)
openssl           0.390000   0.000000   0.390000 (  0.390846)
nil               0.000000   0.000000   0.000000 (  0.003219)
------------------------------------------ total: 2.950000sec

                      user     system      total        real
ruby-hmac w/new   1.050000   0.000000   1.050000 (  1.055101)
openssl w/new     0.430000   0.010000   0.440000 (  0.436892)
ruby-hmac         1.010000   0.000000   1.010000 (  1.003732)
openssl           0.390000   0.000000   0.390000 (  0.389281)
nil               0.000000   0.000000   0.000000 (  0.003057)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment