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

C#转PHP的HMAC-SHA256哈希结果不一致,排查换行符问题

解决C#与PHP HMAC-SHA256哈希不一致问题

核心问题出在换行符的实际内容差异:

  • C#中的"\n"是ASCII换行符(LF,ASCII码10),是单个字符
  • PHP中错误使用的"\\n"会被解析成两个字符:反斜杠\和字母n

两者拼接出的消息内容完全不同,自然导致哈希结果不一致,修正方案如下:

1. 修正PHP的换行符拼接逻辑

直接使用"\n"拼接消息,而非转义的"\\n"。示例对比:

C# 消息拼接代码

string message = "参数1" + "\n" + "参数2";

对应PHP 正确拼接代码

$message = '参数1' . "\n" . '参数2';

2. 验证消息内容一致性

可以通过输出消息的十六进制表示,确认C#和PHP拼接的消息完全相同:

  • C# 输出十六进制:
string hexMessage = BitConverter.ToString(Encoding.UTF8.GetBytes(message)).Replace("-", "");
  • PHP 输出十六进制:
$hexMessage = bin2hex($message);

对比两者的hexMessage结果,确保完全一致。

3. 对齐HMAC-SHA256实现细节

确保密钥编码、哈希输出格式完全匹配:

  • 密钥统一使用UTF-8编码(C#中Encoding.UTF8.GetBytes(key),PHP中直接传入字符串即可,默认UTF-8)
  • 哈希输出统一格式:比如都返回原始字节数组再转Base64,或直接返回十六进制字符串

完整匹配示例

C# 哈希实现

string key = "your-secret-key";
string message = "param1" + "\n" + "param2";

HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
string finalHash = Convert.ToBase64String(hashBytes);

PHP 对应哈希实现

$key = 'your-secret-key';
$message = 'param1' . "\n" . 'param2';

$hashBytes = hash_hmac('sha256', $message, $key, true); // true返回原始字节
$finalHash = base64_encode($hashBytes);

调整后两者的finalHash结果将完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:54:33