2

C# DKIM バリデーターを作成していて、解決できない問題に遭遇しました。現在、セクション 3.7 Computing the Message Hashesで説明されているように、ボディ ハッシュの計算に取り組んでいます。Exchange 2010 トランスポート エージェント SDK の EdgeTransportAsyncLogging サンプルの修正版を使用してダンプした電子メールを処理しています。保存時に電子メールを変換する代わりに、MessageID に基づいてファイルを開き、生データをディスクにダンプします。

次のコードを使用して、セクション 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そして、私がそれに取り組んでいる間(それを機能させることができませんでした)、私はついにメッセージに出くわしましたCRLF。(実際、ボディの正規化のルールは非常に単純です。)

これは、単純なアルゴリズム (完全に変更されていない) を使用した署名付きの実際の DKIM メールです(右クリックして保存すると、ブラウザは末尾を食べますCRLF)。上記のコードを使用してexpectedBase64ハッシュを更新すると、次の結果が得られます。

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

予想されるハッシュは、ヘッダーのbh=フィールドの値です。DKIM-Signatureここで、2 番目のテストで使用されるファイルは、Exchange 2010 トランスポート エージェントからの直接の生出力です。気が向いたら、変更されたEdgeTransportLogging.txtを表示できます。

この時点で、2 番目のメールをどのように変更してCRLFも、ファイルの末尾の開始位置または番号を変更しても、ファイルが一致しません。私が心配しているのは、これまでボディ ハッシュ (単純または緩和) を検証できなかったこと、Exchange 2010 を介して DKIM を処理することが現実的ではない可能性があることです。

4

1 に答える 1

1

これを python-dkim で試してみましたが、ボディ ハッシュの不一致も発生します。

GetMimeReadStreamおそらく、Exchangeは送信された実際のバイトを提供していないため、ハッシュが一致しないと思います。おそらく、メッセージを MIME 部分に逆アセンブルしているため、GetMimeReadStream はメッセージ有効な表現を提供しますが、最初に送信されたものではありません。

おそらく、実際の生のバイトを提供する別の API があるでしょうか?

あるいは、プロセスのこの時点までにメッセージがばらばらになり、元のメッセージが破棄されている可能性があります。早期に接続する必要があります。

おそらく、DKIM で署名されたメッセージを Exchange 以外のサーバーに送信して傍受し、それがコードで機能するかどうかを確認する必要があります。 GetContentReadStreamおそらく動作するでしょうか?

とにかく、私が次にすることは、送信されたものをバイト単位で提供する API を見つけることです。

于 2010-06-01T01:22:44.607 に答える