HMAC二进制摘要节点与Ruby

时间:2019-05-05 21:45:05

标签: node.js ruby encoding hmac

我正在尝试使用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'

Ruby

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"

我怎样才能使这两个相等?

谢谢!

2 个答案:

答案 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换行符和尾随填充。