在 php 中使用 SHA256 hmac 生成散列消息(key & msg 是假的)
Posted
技术标签:
【中文标题】在 php 中使用 SHA256 hmac 生成散列消息(key & msg 是假的)【英文标题】:Generate a hashed message with SHA256 hmac in php (key & msg are fake) 【发布时间】:2021-12-21 03:49:29 【问题描述】:我正在使用 php 8.0.11,我必须生成一个 SHA256 加密消息签名。当我在预请求脚本中使用 javascipt 代码在邮递员中测试 API 时,它会给出正确的加密消息签名,我将脚本转换为 php我在 php 中对其进行测试,它发送了一个不同的错误加密消息签名(密钥和消息是假的):
javascript 代码(邮递员中的预请求脚本):
let msg='mymessage'
const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256,"myapipkey");
hmac.update(msg);
const messageSignature = hmac.finalize().toString();
pm.globals.set("messageSignature",messageSignature);
console.log('messageSi:',pm.globals.get('messageSignature'))
````
php code:
````php
$data_to_hash = "mymessage";
$data_hmac=hash('sha256', $data_to_hash);
$ctx = hash_init('sha256', HASH_HMAC, 'myapipkey');
hash_update($ctx, $data_hmac);
$result = hash_final($ctx);
echo $result;
````
【问题讨论】:
这能回答你的问题吗? Encrypt with PHP, Decrypt with Javascript (cryptojs) 还是这个? ***.com/questions/20433467/… 还是这个? ***.com/questions/34941233/… 或者这是否回答了您的问题? Encrypt with CryptoJS and decrypt with PHP @NicoHaase 我认为第二个和第三个链接的 QA 是有道理的,但第一个是关于加密/解密的,而不是 OP 真正要求的。 【参考方案1】:对 PHP 代码的简单更改应该会给出正确的结果。
看起来你正在哈希两次(或类似的东西!)
$data_to_hash = "mymessage";
$ctx = hash_init('sha256', HASH_HMAC, 'myapipkey');
hash_update($ctx, $data_to_hash);
$result = hash_final($ctx);
echo $result;
无论如何,上述代码的输出将是:
898786a1fa80da9b463c1c7c9045377451c40cf3684cbba73bdfee48cd3a5b8f
与 JavaScript 代码相同,都匹配此处给出的输出:
https://codebeautify.org/hmac-generator
算法 = 'SHA256',密钥 = 'myaipkey' 和明文 = 'mymessage'。
【讨论】:
以上是关于在 php 中使用 SHA256 hmac 生成散列消息(key & msg 是假的)的主要内容,如果未能解决你的问题,请参考以下文章
如何在基于 Android 的 Java 中使用 SECRET KEY 制作 HMAC SHA256? [复制]
万事达卡 migs md5 到 SHA-256 HMAC php
java 用Java生成HMAC MD5 / SHA1 / SHA256等