【问题标题】:NodeJS HMAC Hash CreationNodeJS HMAC 哈希创建
【发布时间】:2017-06-17 08:07:07
【问题描述】:

我正在尝试遵循用 PHP 编写的 API 教程的一部分。他们展示了以下示例:

$public = 'JkAFq7M47kLN0xVD';
$private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB';

$url = 'https://pterodactyl.local/api/admin/users';
$body = '';

$hmac = hash_hmac('sha256', $url . $body, $private, true);

return $public . '.' . base64_encode($hmac);

// Should return the string below:
//
// JkAFq7M47kLN0xVD.wgIxj+V8RHgIetcQg2lRM0PRSH/y5M21cPz9zVhfFaQ=

但是我的方法没有返回正确的值。相反,它返回以下内容:

JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo=

这是我的代码:

    hmac = crypto.createHmac('sha256', private_key);
    hmac.write(url+body);
    hmac.end();
    hash = hmac.read().toString('base64');
    console.log(hash);

编辑:我认为他们提供的示例是无效的,因为每个人都说我的代码几乎相同,而 PHP 代码输出的值与文档中说的不同。

【问题讨论】:

  • “应该返回下面的字符串” - 嗯,它没有。您的 PHP 代码和您的 node.js 代码当前是等效的。也许您应该检查您的 PHP 代码是否真的按照您的想法运行。
  • 这不是公钥加密的工作方式。 HMAC 是一个对称组件。
  • @ArtjomB.这不是公钥加密的工作原理吗?
  • @ArtjomB。这不是公钥加密是一件好事。这只是一个客户端身份验证标头。如果您正确阅读问题,则与密钥无关。

标签: php node.js encryption cryptography hmac


【解决方案1】:

好吧,我用这个工具writephponline 来运行这个php代码:

$public = 'JkAFq7M47kLN0xVD';
$private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB';

$url = 'https://pterodactyl.local/api/admin/users';
$body = '';

$hmac = hash_hmac('sha256', $url . $body, $private, true);

echo $public . '.' . base64_encode($hmac);

然后返回:

JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo=

所以我用它作为参数,然后我做了一个小nodejs脚本:

var crypto = require('crypto');

var public = 'JkAFq7M47kLN0xVD';

var private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB';

var url = 'https://pterodactyl.local/api/admin/users';

var body = '';

var hmac = crypto.createHmac('sha256', private).update(url+body).digest('base64');

console.log(public + '.' + hmac);

然后返回:

JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo=

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我更喜欢使用crypto-js 加密标准库。这个库一直在维护。

    const crypto = require('crypto-js')
    
    const public = 'JkAFq7M47kLN0xVD'
    const private = 'E6X9FyZvMFeJbqtq.IwjlTuR.MKDoicB'
    const url = 'https://pterodactyl.local/api/admin/users'
    const body = ''
    
    const hmac = crypto.HmacSHA256(url + body, private).toString(crypto.enc.Base64)
    
    console.log(public + '.' + hmac)
    // Print value:
    // JkAFq7M47kLN0xVD./RKZS3U2FKfEt7/tEks4vWwyS+89lL+k8aEGO8NJWuo=
    

    【讨论】:

    • 嗯,我使用的是 NodeJS 大神们自己内置和维护的。
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 2020-03-04
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2013-01-09
    相关资源
    最近更新 更多