encryption - 为什么我的 crypto.createHmac() 会为相同的输入生成不同的 HMAC?

标签 encryption cryptography php javascript hmac

我正在尝试将 Node.js 中的 HMAC 与 PHP 中的 HMAC 进行匹配以进行 API 授权。问题在于 Node.js 中,createHmac() 函数为相同的输入生成不同的 HMAC,因此与 PHP 中的 HMAC 不匹配。

这是我的 JS 代码:

events: {
  proxyReq: (proxyReq, req) => {
    const API_KEY = 125;
    const API_SECRET_KEY = 'abc';

    let hmac = crypto.createHmac('sha512', API_SECRET_KEY);
    hmac.update('0');
    const s = hmac.digest('base64');

    proxyReq.setHeader('x-api-key', API_KEY);
    proxyReq.setHeader('x-api-signature', s);
    proxyReq.setHeader('x-api-date', date);
  },

PHP:

$API_SECRET_KEY = 'abc';
$client_signature = $request->header('x-api-signature');
$hmac = base64_encode(hash_hmac('sha512', '0', base64_decode($API_SECRET_KEY), true));

Log::error($client_signature);
Log::error($hmac);

最新输出:

[2018-07-11 15:25:28] local.ERROR: dO50o/LcS0/UOXOu/5lHbOMXLe+l225vUU13fWEHeOoUHV7SlcSOE9rQq2UhTlys5N6C4hkq8QTALnpRehtlCg==  
[2018-07-11 15:25:28] local.ERROR: 7W2U/3uEKIMD0s39jmZLlJItwTcSSDQdW7WTYdslvIjuUeGydyqwwAuZzaMP0Do5v1zRJxmPITFdy4EHTY5r6A==  

[2018-07-11 15:25:33] local.ERROR: UYsXZFyoAB2zELZzwjWyktPEHlYqIP3cgLeb/LXK0X8pnkVxiqEaFWK7c1YIWd6hFPpZHn5j1YdbDhpAL7hQ5A==  
[2018-07-11 15:25:33] local.ERROR: 7W2U/3uEKIMD0s39jmZLlJItwTcSSDQdW7WTYdslvIjuUeGydyqwwAuZzaMP0Do5v1zRJxmPITFdy4EHTY5r6A==  

任何替代方案或解决方案将不胜感激!

最佳答案

您正在 PHP 中进行 base64_decode 加密,但不在 Node 中进行加密。删除base64_decode,您将得到:

gvRZ6BJer/YEkwdJ2OrTetIt1Knza5Vr0ZZ/inV5ySkFW4PBnO77c19L7TFpy9c4FA98/OcK/pB8Gvumwo4CQw==

这与我在测试您的 JavaScript 代码时得到的结果相符。

关于encryption - 为什么我的 crypto.createHmac() 会为相同的输入生成不同的 HMAC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51483325/

相关文章:

java - 如何在不进行字母频率分析的情况下破解凯撒密码

c# - 如何加密查询字符串避免加号、斜杠和反斜杠?

c# - 加密 QRCode 有效负载,输入长度与输出长度相同

php - 如何使用ajax和php从mysql表返回值

encryption - 为什么 .key 文件包含 P、Q、DP、DQ

c# - Java中的AES加密和C#中的解密

C# bruteforce md5 哈希字符串

encryption - 自修改哈希加密算法

php - 使用 PHP 在 Web 服务器上打开文件

php - 如何通过命令行运行 php 脚本(并在注销后保持运行)