System.Security.Cryptography.HMAC类异常?HMACMD5计算值不符预期
问题根因
两边代码传入HMAC计算的原始字节不一致,直接导致结果不匹配:
- Rust实现中,传入哈希函数的是十六进制字符串
fdfeefeaa33d4f683bc843cae4375592439fa980ac969e7757226baf15ef5398本身的UTF8编码字节,共64字节。 - C#实现中,你调用
Convert.FromHexString()把上述十六进制字符串解码成了对应的二进制数据,仅32字节,和Rust传入的内容完全不同,计算结果自然不符合预期。
修复方法
将C#代码中待哈希内容的处理逻辑对齐Rust实现,直接获取目标字符串的UTF8编码字节即可,移除十六进制解码逻辑:
[Test] public void should() { var key = Encoding.UTF8.GetBytes("foobarsecret42"); var hmac = new HMACMD5(key); var expected = "4c7bd5ae85894f78eb87bd2955f4cd83"; var actual = hmac.ComputeHash(Encoding.UTF8.GetBytes( "fdfeefeaa33d4f683bc843cae4375592439fa980ac969e7757226baf15ef5398")); Convert.ToHexString(actual).ToLower().Should().Be(expected); }
补充说明:如果实际业务要求待签名的内容确实是上述十六进制字符串对应的二进制数据,那C#的原始写法逻辑正确,需要调整Rust侧的输入处理逻辑。HMAC计算对输入字节极其敏感,必须保证两端传入的原始字节、密钥字节完全一致,才能得到相同的结果。
内容的提问来源于stack exchange,提问作者PetoMPP
相关产品推荐
相关产品推荐

