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



为了API授权,我正在尝试将Node.js中的HMAC与PHP中的HMC进行匹配。问题是在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相匹配,则会得到正确的值:

const crypto = require('crypto');
const API_SECRET_KEY = Buffer.from('abc', 'base64');
let hmac = crypto.createHmac('sha512', API_SECRET_KEY);
hmac.update('0');
const s = hmac.digest('base64');
console.log(s);

7W2U/3uEKIMD0s39jmZLlJItwTcSSDQdW7WTYdslvIjuUeGydyqwwAuZzaMP0Do5v1zRJxmPITFdy4EHTY5r6A==

https://repl.it/repls/BouncyBogusGigabyte

请检查您是否确实具有正确的常量API_SECRET_KEY值、正确的数据输入值(在本例中为"0"(,并且您正在查看PHP代码中的正确请求。如果提供相同的输入,两个库将为您提供相同的输出值。

最新更新