質問

私はC#DKIM VALIDATORを書いており、解決できない問題に出くわしました。今のところ、私はで説明されているように、ボディハッシュの計算に取り組んでいます セクション3.7メッセージの計算ハッシュ. 。 Exchange 2010 Transport Agent 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を処理することは実行不可能である可能性があります。

役に立ちましたか?

解決

これをPython-Dkimで試してみましたが、ボディハッシュの不一致も得られます。

おそらく交換していると思います GetMimeReadStream それらが送信されたため、実際のバイトを与えていないため、ハッシュは一致しません。おそらくそれはメッセージをマイムの部分に分解しているので、getmimereadStreamはあなたに与えます a メッセージの有効な表現は、それが元々送信されたものではありません。

おそらく、本当の生のバイトを与える別のAPIがありますか?

あるいは、プロセスのこの時点までに、メッセージは引き裂かれ、元のメッセージが捨てられており、以前にフックする必要があります。

おそらく、非交換サーバーに送信してDKIMに署名したメッセージをインターセプトして、コードで動作するかどうかを確認する必要があります。 GetContentReadStream おそらくうまくいくかもしれませんか?

とにかく、私が次にやろうとすることは、送信されたものをバイトに与えるAPIを見つけようとすることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top