System.Security.Cryptography.HMAC类不能正常工作吗?



我必须使用带有MD5密钥的HMAC提供散列值响应。问题是HMACMD5类正在计算意外值。

下面的代码应该断言值expected等于actual

[Test]
public void should()
{
var key = Encoding.UTF8.GetBytes("foobarsecret42");
var hmac = new HMACMD5(key);
var expected = "4c7bd5ae85894f78eb87bd2955f4cd83";
var actual = hmac.ComputeHash(Convert.FromHexString(
"fdfeefeaa33d4f683bc843cae4375592439fa980ac969e7757226baf15ef5398"));
Convert.ToHexString(actual).ToLower().Should().Be(expected);
}

我已经用多种编码测试了它,它仍然无法创建适当的哈希。我还在https://www.freeformatter.com/上验证了这些值(用于断言)是正确的,并且用下面的Rust编写了一些代码。

use hmac::{Hmac, Mac};
use md5::Md5;
use hex_literal::hex;
fn main() {
type HmacMd5 = Hmac<Md5>;
let mut mac = HmacMd5::new_from_slice(b"foobarsecret42").unwrap();
Mac::update(&mut mac,b"fdfeefeaa33d4f683bc843cae4375592439fa980ac969e7757226baf15ef5398");
let result = mac.finalize();
let bytes = result.into_bytes();
let expected = hex!("4c7bd5ae85894f78eb87bd2955f4cd83");
assert_eq!(bytes[..], expected[..]);
}

数据fd...98既不是在Rust代码中十六进制解码,也不是在在线工具中解码,而是在两种情况下编码UTF-8(或ASCII)。如果在c#代码中也这样做,即使用

var actual = hmac.ComputeHash(Encoding.UTF8.GetBytes("fdfeefeaa33d4f683bc843cae4375592439fa980ac969e7757226baf15ef5398"));

期望值结果

最新更新