I’m rewriting some existing code from Python to Ruby, and I’ve across a strange error that I can’t seem to figure out. Here we have the Python code (which works):
import sha, hmac
data = 'sampledata'
data = data.encode('ascii')
des_key = hmac.new(data + "\0", "SUPERSECRET", sha).digest()[0:8]
Output: 0x64F461D377D9930C
And the Ruby (which I’m new to) code:
require 'openssl'
digest = OpenSSL::Digest::SHA.new
data = 'sampledata'
data.encode!('ascii')
puts OpenSSL::HMAC.hexdigest(digest, "SUPERSECRET", data + "\0")[0, 16]
Output: 0x563FDAF11E63277C
What could be causing this difference?
You made two mistakes:
Python’s hmac.new takes key, method, digest – so you should write
hmac.new(“SUPERSECRET”,data + “\0”, sha)
The default digest method for OpenSSL::Digest in Ruby isn’t SHA1 (I’m not sure what it is). You should just use:
OpenSSL::HMAC.hexdigest(‘sha1’,”SUPERSECRET”,data+”\0″)[0,16]
Both methods (first in Python, second in Ruby) return the same output.