gpt4 book ai didi

c# - 无法验证 DKIM 的正文哈希

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:39 27 4
gpt4 key购买 nike

我正在编写一个 C# DKIM 验证器,遇到了一个我无法解决的问题。现在我正在计算正文哈希,如 Section 3.7 Computing the Message Hashes 中所述。 .我正在使用 Exchange 2010 传输代理 SDK 中使用修改版的 EdgeTransportAsyncLogging 示例转储的电子邮件。它不会在保存时转换电子邮件,而是根据 MessageID 打开一个文件并将原始数据转储到磁盘。

我能够成功计算出 Section A.2 中提供的示例电子邮件的正文哈希值使用以下代码:

SHA256Managed hasher = new SHA256Managed();
ASCIIEncoding asciiEncoding = new ASCIIEncoding();
string rawFullMessage = File.ReadAllText(@"C:\Repositories\Sample-A.2.txt");
string headerDelimiter = "\r\n\r\n";
int headerEnd = rawFullMessage.IndexOf(headerDelimiter);
string header = rawFullMessage.Substring(0, headerEnd);
string body = rawFullMessage.Substring(headerEnd + headerDelimiter.Length);
byte[] bodyBytes = asciiEncoding.GetBytes(body);
byte[] bodyHash = hasher.ComputeHash(bodyBytes);
string bodyBase64 = Convert.ToBase64String(bodyHash);
string expectedBase64 = "2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=";
Console.WriteLine("Expected hash: {1}{0}Computed hash: {2}{0}Are equal: {3}",
Environment.NewLine, expectedBase64, bodyBase64, expectedBase64 == bodyBase64);

以上代码的输出是:

Expected hash: 2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=
Computed hash: 2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=
Are equal: True

现在,大多数电子邮件都带有 c=relaxed/relaxed 设置,这要求您在散列和验证之前对正文和标题做一些工作。当我正在处理它时(未能让它工作),我终于遇到了一条消息 c=simple/simple 这意味着你处理整个 body 减去任何空 CRLF 在主体的末尾。 (真的,Body Canonicalization 的规则相当...... simple 。)

这是 real DKIM email (右键单击并保存它,浏览器吃掉结尾的 CRLF)和使用简单算法(完全未修改)的签名。现在,使用上面的代码并更新 expectedBase64 哈希,我得到以下结果:

Expected hash: VnGg12/s7xH3BraeN5LiiN+I2Ul/db5/jZYYgt4wEIw=
Computed hash: ISNNtgnFZxmW6iuey/3Qql5u6nflKPTke4sMXWMxNUw=
Are equal: False

预期的哈希值是 DKIM-Signature header 的 bh= 字段的值。现在,第二个测试中使用的文件是 Exchange 2010 传输代理的直接原始输出。如果愿意,您可以查看修改后的EdgeTransportLogging.txt .

此时,无论我如何修改第二封电子邮件,更改文件末尾 CRLF 的起始位置或数量,我都无法使文件匹配。让我担心的是,到目前为止,我无法验证任何正文哈希(简单或宽松),并且通过 Exchange 2010 处理 DKIM 可能不可行。

最佳答案

我在 python-dkim 中尝试过这个,我也得到了一个正文哈希不匹配。

我想可能是 Exchange 的 GetMimeReadStream没有为您提供传输时的实际字节,因此散列不匹配。可能它正在将消息分解成它的 mime 部分,然后 GetMimeReadStream 为您提供消息的有效表示,但不是它最初发送的那个。

也许还有另一个 API 可以为您提供真正的原始字节?

或者也许在这个过程中,消息已经被撕裂,原始消息被丢弃,您需要更早地 Hook 。

您可能应该尝试通过将 DKIM 签名的邮件发送到非 Exchange 服务器来拦截它,并查看它是否适用于您的代码。 GetContentReadStream 可能有用吗?

无论如何,我接下来要做的是尝试找到一个 API 来为您提供逐字节发送的内容。

关于c# - 无法验证 DKIM 的正文哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699903/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com