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),请确保:
- (重要)做成同样的格式。
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)
- 有一个正确的密钥。 (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。它也会有相同的结果。
发送
我有 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),请确保:
- (重要)做成同样的格式。
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)
- 有一个正确的密钥。 (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。它也会有相同的结果。
发送