gpt4 book ai didi

php - node.js hmac.digest() 输出似乎有误

转载 作者:搜寻专家 更新时间:2023-10-31 21:42:43 25 4
gpt4 key购买 nike

我正在尝试使用 node.js 实现 Facebook 库,但请求签名不起作用。我有 PHP 示例 seen here翻译成 Node 。我正在用那里给出的示例进行尝试,其中 secret 是字符串“ secret ”。我的代码如下所示:

var signedRequest = request.signed_request.split('.');

var sig = b64url.decode(signedRequest[0]);

var expected = crypto.createHmac('sha256', 'secret').update(signedRequest[1]).digest();

console.log(sig == expected); // false

我不能 console.log 解码字符串本身,因为它们有导致控制台清除的特殊字符(如果你有绕过的建议请告诉我)但我可以输出它们的b64url编码。

如您在 FB 文档中所见,预期的编码 sig 是

vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso

我的 expected 编码后的值是

wr5Vw6DCu8KuAUBhUkLCtjRlw4JBZATCjMK9wovDkx7Dr0ZDRgzDtsK4w49Kw4o

那么为什么我认为 digest 是错误的呢?也许错误在我这边?好吧,如果我执行文档中给出的 PHP 中的确切示例,就会出现正确的结果。但是,如果我更改 hash_hmac 调用,使最后一个参数为 false,输出十六进制,我得到

YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ==

现在,如果我回到我的 javascript 代码,并将我的 hmac 代码更改为 .digest("hex") 而不是默认的 "binary" 并记录结果的 base64 编码,我得到...惊喜!

YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ

相同,只是末尾缺少 == 符号,但我认为这是控制台的问题。我无法想象这是个问题,没有它们,它甚至不是有效的 base64 字符串长度。

那么,为什么摘要方法在使用十六进制时输出正确的结果,而使用二进制时输出错误的结果呢?二进制文件与 PHP 等价物的“原始”输出不完全相同吗?如果是这样的话,正确的调用方式是什么?

最佳答案

我们发现这确实是加密库中的错误,并且是 github 上记录的已知问题。我们将不得不升级并获得修复。

关于php - node.js hmac.digest() 输出似乎有误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8549724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com