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