C# 用c计算Content-MD5 HTTP头文件值#

C# 用c计算Content-MD5 HTTP头文件值#,c#,base64,C#,Base64,我正在实现一个服务的一部分,该服务将响应HTTP请求,我要支持的一个头是Content-MD5。以下是关于Content-MD5计算的说明: 要生成Content-MD5字段的值,需要使用MD5算法 根据MIME实体对象的规范形式计算。在里面 特别是,这意味着发送方将MD5算法应用于 转换为规范格式后的数据,在 应用任何内容传输编码,并且接收方也 在撤消任何 内容传输编码。对于文本数据,这意味着MD5 算法必须在数据上计算,其中 换行符适用,即每个换行符由 CR-LF对。MIME的规范编码模型如

我正在实现一个服务的一部分,该服务将响应HTTP请求,我要支持的一个头是
Content-MD5
。以下是关于
Content-MD5
计算的说明:

要生成Content-MD5字段的值,需要使用MD5算法 根据MIME实体对象的规范形式计算。在里面 特别是,这意味着发送方将MD5算法应用于 转换为规范格式后的数据,在 应用任何内容传输编码,并且接收方也 在撤消任何 内容传输编码。对于文本数据,这意味着MD5 算法必须在数据上计算,其中 换行符适用,即每个换行符由 CR-LF对。MIME的规范编码模型如中所述 附件G

MD5算法的输出是128位摘要。在中查看时 网络字节顺序(大端序),这将产生一个16字节的序列 二进制数据的八位字节。这16个八位字节然后根据 base64算法,以获取放置在中的值 Content-MD5字段。因此,如果应用MD5算法 覆盖MIME实体的原始数据会导致摘要具有 (不太可能)值为“检查完整性!”,则该MIME实体的 标题可能包含该字段

   Content-MD5:  Q2hlY2sgSW50ZWdyaXR5IQ==
(这不是来自HTTP RFC,而是)

在这个阶段,我没有做任何内容传输编码,因此这应该足够简单,但我没有得到我期望的结果:

using System;
using System.Security.Cryptography;
using System.Text;

  //somewhere in the file...
  MD5 md5 = MD5.Create();
  responseBody = Encoding.ASCII.GetBytes("Check Integrity!");
  var hash = md5.ComputeHash(responseBody);
  string encodedHash = Convert.ToBase64String(hash);
  //now the following is true:
  encodedHash == "nwqq6b6ua/tTDk7B5M184w=="

知道我的代码哪里出了问题吗?

代码没有问题,但我确实误读了RFC:

因此,如果将MD5算法应用于 MIME实体导致摘要的值(不太可能)为“Check” 正直!(……)

“检查完整性!”
是(不太可能的)MD5哈希结果,而不是正在哈希的响应。字符串的长度正好是16个ASCII字符,这不是巧合

更新的验证代码的行为符合预期:

var hash = Encoding.ASCII.GetBytes("Check Integrity!");
Assert.AreEqual(16, hash.Count()); // true
string encodedHash = Convert.ToBase64String(hash);
Assert.AreEqual(encodedHash, "Q2hlY2sgSW50ZWdyaXR5IQ=="); // true