在 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

php PHP和ASP.NET HMAC-SHA256签名

java 用Java生成HMAC MD5 / SHA1 / SHA256等

Python JWT 库 PyJWT 使用 HS256 签名时遇到问题 - 使用 SHA-256 哈希算法的 HMAC

hmac-sha256 2021-11-02