Lan*_*der 3 ruby python sha hmac
我正在将一些现有代码从Python重写为Ruby,而且我遇到了一个我似乎无法弄清楚的奇怪错误.这里我们有Python代码(可以工作):
import sha, hmac
data = 'sampledata'
data = data.encode('ascii')
des_key = hmac.new(data + "\0", "SUPERSECRET", sha).digest()[0:8]
Run Code Online (Sandbox Code Playgroud)
输出:0x64F461D377D9930C
而Ruby(我是新手)的代码:
require 'openssl'
digest = OpenSSL::Digest::SHA.new
data = 'sampledata'
data.encode!('ascii')
puts OpenSSL::HMAC.hexdigest(digest, "SUPERSECRET", data + "\0")[0, 16]
Run Code Online (Sandbox Code Playgroud)
输出:0x563FDAF11E63277C
什么可能导致这种差异?
你犯了两个错误:
Python的hmac.new采用密钥,方法,摘要 - 所以你应该写
hmac.new("SUPERSECRET",数据+"\ 0",sha)
Ruby中OpenSSL :: Digest的默认摘要方法不是SHA1(我不确定它是什么).你应该使用:
OpenSSL的:: HMAC.hexdigest( 'SHA1', "绝密",数据+ "\ 0")[0,16]
两种方法(首先在Python中,第二在Ruby中)返回相同的输出.