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

时间:2016-07-29 09:55:33

标签: ruby node.js sha1

我有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相同的结果?

2 个答案:

答案 0 :(得分:5)

您正在比较Ruby代码中的普通SHA1摘要和节点代码中的HMAC(使用SHA1作为其散列函数)。虽然HMAC使用SHA1,但这些是不同的东西。

通常你想在普通的SHA1上使用HMAC。要在Ruby中执行此操作,您可以执行以下操作:

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

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

/searchProducts?q=<search-term>

答案 1 :(得分:0)

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

  1. (重要)使其格式相同。

红宝石:

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

节点:

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

红宝石:

key = "v1tg3cOvfNdxh4TXxtdVmeB106doeQFS"

节点:

key = "v1tg3cOvfNdxh4TXxtdVmeB106doeQFS"

转化

红宝石:

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

节点:

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

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

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

发送