【问题标题】:node.js and ruby 1.8 different hmac sha1 resultnode.js 和 ruby​​ 1.8 不同的 hmac sha1 结果
【发布时间】:2016-07-29 09:55:33
【问题描述】:

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

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

我想用 node.js 复制它:

键='123'; myhmac = crypto.createHmac('sha1', key); 结果 = myhmac.update('测试字符串').digest('hex'); // 'a145f4d366e9e4e96b80bc427144ba77b3c7151a'

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

【问题讨论】:

    标签: ruby node.js sha1


    【解决方案1】:

    您将 Ruby 代码中的纯 SHA1 摘要与 Node 代码中的 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
    

    【讨论】:

    • 非常感谢您的帮助!
    • 我真的不明白 a145f4d366e9e4e96b80bc427144ba77b3c7151a 如何等于 c1bdfd602e1581f1ab91928e2c3fd371a1e63a5c,对我来说这是两个不同的值。你能澄清你的答案吗?
    • @PaulLaffitte 我的 Ruby 代码 (a145...) 的结果与 来自问题 的节点代码的结果相同,而不是 my 节点代码。同样,我的 Node 代码结果 (c1bd...) 与问题中 Ruby 代码的结果相同。我的 Ruby 代码与我的 Node 代码给出了不同的结果。
    【解决方案2】:

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

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

    红宝石:

    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)

    红宝石:

    key = "v1tg3cOvfNdxh4TXxtdVmeB106doeQFS"
    

    nodejs:

    key = "v1tg3cOvfNdxh4TXxtdVmeB106doeQFS"
    

    转化

    红宝石:

     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。它也会有相同的结果。

    发送

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多