.NET HMACMD5哈希转PHP等效实现:结果不一致问题求助
解决.NET HMACMD5与PHP hash_hmac结果不一致的问题
我帮你梳理下这个差异的核心原因哈——本质是输出格式的不同:
- .NET的
HMACMD5.ComputeHash()返回的是原始二进制字节数组,直接是哈希计算后的原始字节值; - 而PHP的
hash_hmac()默认返回的是小写十六进制字符串,是把原始字节转换成了人类可读的十六进制格式。
所以两者的哈希计算逻辑是一致的,只是输出形式不一样,导致你看起来结果不同。
修正后的PHP代码
要让PHP的输出和.NET的字节数组内容完全匹配,只需要给hash_hmac()加上第四个参数true,让它返回原始二进制字节流:
// 第四个参数设为true,返回原始二进制字节,和.NET的Byte()数组内容一致 $computedHash = hash_hmac('md5', $stringToHash, $secretPassword, true);
验证对比(可选)
如果你需要把PHP的原始字节转换成和.NET字节数组对应的十六进制形式(方便打印对比),可以用bin2hex()转换:
$hexHash = bin2hex($computedHash);
这个十六进制字符串就和你把.NET字节数组逐个转成十六进制拼接后的结果一致了。
参考代码对比
.NET原代码:
Dim hmac As New HMACMD5(secretPassword) Dim computedHash As Byte() = hmac.ComputeHash(stringToHash)
内容的提问来源于stack exchange,提问作者Ian004
相关产品推荐
相关产品推荐

