我正在尝试使用Ruby文档(ugh)实现Node API。具体来说,问题是围绕验证一个秘密,这个秘密是通过HMAC摘要放入,然后进行base64编码的。
我似乎无法使两者相等。以下是Node&Ruby中的相同片段:
注意:也可以通过repl.it在线查看以下内容:
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')
Ruby
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), key, text)
不幸的是,切换到十六进制不由我决定-Web服务使用ruby代码进行签名。
在OpenSSL::HMAC.digest
状态下查找ruby文档:
将身份验证代码作为二进制字符串返回。
仅从HMAC输出结果,我无法确定这是区别还是仅仅是渲染问题:
节点
crypto.createHmac('sha256', key).update(text).digest('binary');
# => 'iTðIE(§Yñ©ùu¥\u001bgî9&¼ö,-º'
Ruby
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"
我怎样才能使这两个相等?
谢谢!
答案 0 :(得分:0)
通过不向Node的摘要方法输入任何特定的编码,将输出原始unicode缓冲区-与Ruby匹配。
这是最终结果:
crypto = require('crypto');
text = 'example';
key = '123';
h = crypto.createHmac('sha256', key).update(text).digest();
Buffer.from(h).toString('base64');
谁会想到的-您什么也不能传入方法...
答案 1 :(得分:0)
要让Ruby输出Base64:
require 'openssl'
require 'base64'
text = 'example'
key = '123'
Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, text))
# "aY1U8ElFKKdZ8ZyOh6n5nnWliBuSZ+45Jrz2LJkthLo=\n"
如果需要,您可以删除\n
换行符和尾随填充。