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

