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

node.js and ruby 1.8 different hmac sha1 result

我有 ruby 1.8.7 使用 sha1 创建 hmac 的代码

key= '123'
digest = Digest::SHA1.new
digest << 'test string'
digest << key
result = digest.hexdigest
# "c1bdfd602e1581f1ab91928e2c3fd371a1e63a5c"

我想用 node.js 复制这个:

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

但结果不同。 我应该在 nodejs 中做什么才能得到与 ruby?

相同的结果

您正在比较 Node 代码中的普通 SHA1 digest in your Ruby code with a 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

要在 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

要使其同时适用于(nodejs 和 ruby),请确保:

  1. (重要)做成同样的格式。

ruby:

payload = "{'name': 'james kachiro sarumaha', 'data': [], 'is_available': true}"
payload = payload.to_json

nodejs:

payload = "{'name': 'james kachiro sarumaha', 'data': [], 'is_available': true}"
payload = JSON.stringify(payload)
  1. 有一个正确的密钥。 (32)

ruby:

key = "v1tg3cOvfNdxh4TXxtdVmeB106doeQFS"

nodejs:

key = "v1tg3cOvfNdxh4TXxtdVmeB106doeQFS"

转化

ruby :

 digest =   OpenSSL::Digest::SHA256.new
 result = OpenSSL::HMAC.hexdigest(digest, password, payload)
 #bd0724a05fab03e64e0112d09ceb11b6c1cbd8f9629a1d303e8d395d36cce396

nodejs:

 crypto.createHmac('sha256', key).update(payload).digest('hex')
 //bd0724a05fab03e64e0112d09ceb11b6c1cbd8f9629a1d303e8d395d36cce396

来自加密模块(nodejs 核心)的加密。

就我而言,我使用的是 SHA256,但您可以将其更改为 SHA1。它也会有相同的结果。

发送