PHP与C#的HMACSHA256签名代码是否等价?输出不一致如何解决
C# HMAC-SHA256逻辑迁移PHP解决方案
问题原因
两者输出不一致主要来自两个核心差异:
- 字符编码不统一:C#代码中明确使用UTF-8编码将私钥、消息字符串转换为字节数组参与哈希运算,PHP代码未对输入的
$message、$PRIVATE_KEY做编码约束,如果这两个变量的原始编码不是UTF-8,计算出的哈希结果必然和C#不一致。 - 哈希输出格式错误:PHP的
hash_hmac函数第四个参数$raw_output如果被手动设置为true,会返回原始二进制数据,和C#输出的小写十六进制字符串格式不匹配。
修正后的PHP代码
// 统一输入编码为UTF-8,对齐C#逻辑 $utf8PrivateKey = mb_convert_encoding($PRIVATE_KEY, 'UTF-8', mb_detect_encoding($PRIVATE_KEY)); $utf8Message = mb_convert_encoding($message, 'UTF-8', mb_detect_encoding($message)); // 计算小写十六进制格式的HMAC-SHA256哈希 $hash = hash_hmac('sha256', $utf8Message, $utf8PrivateKey, false); // 拼接最终结果 $digest = $PUBLIC_KEY . ':' . $hash;
验证方法
使用固定测试值分别在C#和PHP环境运行:
- 公钥:
test_pub - 私钥:
test_pri - 消息:
test_msg
两边输出的digest完全一致即为适配成功。
内容的提问来源于stack exchange,提问作者Lynob
相关产品推荐
相关产品推荐

