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
相关产品推荐
相关产品推荐

