You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# HMACSHA1与PHP hash_hmac哈希结果不一致问题求助

问题排查:PHP与C# HMAC-SHA1签名结果不一致

哦,我一眼就发现问题所在了——你把PHP hash_hmac函数的参数顺序搞反了!这是跨语言对接HMAC时很容易踩的坑,因为C#和PHP的HMAC接口参数顺序正好相反。

核心差异:参数顺序

  • 在C#的代码里,逻辑是先用密钥初始化HMAC对象,再对消息计算哈希:

    HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
    byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
    

    本质是:用指定密钥处理目标消息

  • 但PHP的hash_hmac函数参数顺序是:hash_hmac(算法名称, 要签名的消息, 签名密钥, 是否返回二进制结果)
    你之前的代码写成了hash_hmac('sha1', $key, $message, true),相当于把密钥当成了消息、消息当成了密钥来计算HMAC,结果当然和C#的输出完全不同!

修正后的PHP代码

把$key和$message的位置调换过来即可:

$key = 'a1';
$message = 'b1';
// 注意参数顺序:消息在前,密钥在后
$hmac = hash_hmac('sha1', $message, $key, true);
$hmac_base64 = base64_encode($hmac);

function getByteArray($text) {
    $secretBytes = array();
    for($i = 0; $i < strlen($text); $i++) {
        $secretBytes[] = ord($text[$i]);
    }
    return $secretBytes;
}

echo 'KEY BYTES: '.implode(',', getByteArray($key)).'<br>';
echo 'MESSAGE BYTES: '.implode(',', getByteArray($message)).'<br>';
echo 'HMAC BYTES: '.implode(',', getByteArray($hmac)).'<br>';
echo 'HMAC: '.$hmac_base64;

验证结果

修正后运行代码,你会得到和C#完全一致的输出:

  • HMAC BYTES: 219,205,149,90,235,40,133,252,91,27,240,61,201,173,220,76,73,248,92,212
  • 签名结果:282VWusohfxbG/A9ya3cTEn4XNQ=

补充说明

你之前看到的key和message字节数组匹配,只是因为单纯的ASCII编码转换和HMAC计算逻辑无关。但HMAC的核心是密钥与消息的角色划分,顺序反了就完全是另一个计算过程,所以结果差异巨大。

内容的提问来源于stack exchange,提问作者user1372880

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:17:44