node.js和ruby 1.8不同的hmac sha1结果

mhd*_*mhd 0 ruby sha1 node.js

我有ruby 1.8.7代码,用sha1创建hmac

key= '123'
digest = Digest::SHA1.new
digest << 'test string'
digest << key
result = digest.hexdigest
# "c1bdfd602e1581f1ab91928e2c3fd371a1e63a5c"
Run Code Online (Sandbox Code Playgroud)

我想用node.js复制它:

key= '123';
myhmac = crypto.createHmac('sha1', key);
result = myhmac.update('test string').digest('hex');
// 'a145f4d366e9e4e96b80bc427144ba77b3c7151a'

但结果却不同.我应该在nodejs中做什么才能获得与ruby相同的结果?

mat*_*att 5

您正在将Ruby代码中的简单SHA1摘要与节点代码中的HMAC(使用SHA1作为其散列函数)进行比较.虽然HMAC使用SHA1,但这些是不同的东西.

通常,您希望在简单的SHA1上使用HMAC.要在Ruby中执行此操作,您可以执行以下操作:

require 'openssl'

key = '123'
data = 'test string'
digest = OpenSSL::Digest::SHA1.new

# See how HMAC uses SHA1 here:
result = OpenSSL::HMAC.hexdigest(digest, key, data) 
# => "a145f4d366e9e4e96b80bc427144ba77b3c7151a", same as your node result
Run Code Online (Sandbox Code Playgroud)

要在Node中重现Ruby结果(计算消息的SHA1 +键),你需要这样的东西:

const crypto = require('crypto');
const hash = crypto.createHash('sha1'); // Just SHA1, no HMAC

hash.update('test string');
hash.update('123'); // The Ruby code is hashing the concatenation of
                    // the data and key
result = hash.digest('hex');
// => 'c1bdfd602e1581f1ab91928e2c3fd371a1e63a5c', same as Ruby code
Run Code Online (Sandbox Code Playgroud)