【发布时间】:2019-05-05 21:45:05
【问题描述】:
我正在尝试使用 Ruby 文档(呃)实现一个 Node API。具体问题在于验证一个秘密,该秘密通过 HMAC 摘要然后进行 base64 编码。
我似乎无法将两者等同起来。以下是 Node 和 Ruby 中的相同 sn-ps:
注意:以下内容也可以通过repl.it在线查看:
- 鲁比 (https://repl.it/repls/SarcasticSpottedSymbol)
- 节点 (https://repl.it/repls/AncientQuarrelsomeWearable)
节点
const crypto = require('crypto');
let text = 'example';
let key = '123';
let h = crypto.createHmac('sha256', key).update(text).digest('binary');
Buffer.from(h).toString('base64');
# => 'acKNVMOwSUUowqdZw7HCnMKOwofCqcO5wp51wqXCiBvCkmfDrjkmwrzDtizCmS3ChMK6'
红宝石
require 'openssl'
require 'base64'
text = 'example'
key = '123'
h = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, text)
Base64.strict_encode64(h)
# => 'aY1U8ElFKKdZ8ZyOh6n5nnWliBuSZ+45Jrz2LJkthLo='
同时切换到十六进制工作,例如
节点
crypto.createHmac('sha256', key).update(text).digest('hex')
红宝石
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), key, text)
不幸的是,我不能切换到十六进制 - 网络服务使用 ruby 代码进行签名。
查找 OpenSSL::HMAC.digest 状态的 ruby 文档:
以二进制字符串的形式返回验证码。
只是从 HMAC 输出结果,我无法判断这是差异还是渲染问题:
节点
crypto.createHmac('sha256', key).update(text).digest('binary');
# => 'iTðIE(§Yñ©ùu¥\u001bgî9&¼ö,-º'
红宝石
OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, text)
# => "i\x8DT\xF0IE(\xA7Y\xF1\x9C\x8E\x87\xA9\xF9\x9Eu\xA5\x88\e\x92g\xEE9&\xBC\xF6,\x99-\x84\xBA"
我怎样才能让这两者等同起来?
谢谢!
【问题讨论】:
标签: node.js ruby encoding hmac