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

.NET实现PHP hash_hmac("sha384")等价哈希的问题排查

问题背景

PHP端使用HMAC-SHA384算法计算消息认证码的代码如下:

<?php
  $key="mM8Y28b5R7KFe3Y5";   
  $data="298052380sbEUREinzellizenz Spieler SEN329739test120211572380R-00001003authorization19";
  $hash=hash_hmac("sha384", $data, $key);
  echo $hash;
?>

执行后得到的正确哈希结果为:

f34fb28f6462cde18a92ee854d289ba5aed3cfc07d0abb52cfef3b70028e1b38b098ae17514a9121d43d3d6f684eccd8

在.NET中两次尝试复现该逻辑均得到错误结果:

  • 第一次尝试直接使用无密钥的普通SHA384类计算,得到结果77b7eccd4f66b07c66e2c49b83e53bf84dfd4dc67ec60007df4476adfe16d9b0bfdd6e58e9a5008bde4908335d161ef5
  • 第二次尝试使用HMAC类但错误选用HMACSHA256实现,得到结果ceaabe254e19d77940ac3edfdf2fa3d1de424d569136e8deb770aa81be5cb24a
错误原因

两次实现的核心问题都是算法选择不匹配:

  • 普通SHA384是无密钥的哈希算法,和PHP使用的带密钥的HMAC消息认证码算法逻辑完全不同,不存在结果一致的可能。
  • HMACSHA256对应的是HMAC-SHA256算法,和PHP指定的sha384算法版本不匹配,输出哈希长度、计算结果都不会一致。
正确实现代码

使用.NET中与HMAC-SHA384对应的HMACSHA384类即可得到和PHP完全一致的结果,代码如下:

string data = "298052380sbEUREinzellizenz Spieler SEN329739test120211572380R-00001003authorization19";
string key = "mM8Y28b5R7KFe3Y5";
string hash = string.Empty;
byte[] keyBytes = Encoding.ASCII.GetBytes(key);
using (HMACSHA384 hmac = new HMACSHA384(keyBytes))
{
    byte[] dataBytes = Encoding.ASCII.GetBytes(data);
    byte[] hashBytes = hmac.ComputeHash(dataBytes);
    hash = BitConverter.ToString(hashBytes).Replace("-", string.Empty).ToLower();
}

执行上述代码得到的哈希值与PHP输出完全匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:30:59