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 を処理することが現実的ではない可能性があることです。