5

ここに暗号化方法を使用する従来の ASP.NET サイトがあります。

http://www.codekeep.net/snippets/af1cd375-059a-4175-93d7-25eea2c5c660.aspx

次のメソッドを呼び出すと、ページの読み込みが非常に遅くなり、最終的に Connection Reset が返されます。

Decrypt(" ", true);

後続のページ要求でメソッドが複数回呼び出されると、アプリケーション プールが停止します。

これは、.NET Framework v3.5 を実行している Windows 2008 サーバーで発生しています。

TransformFinalBlock()問題を呼び出しに絞り込みました。

注: Cassini では、接続タイムアウトは発生しません。代わりに、次の例外がスローされます。

System.Security.Cryptography.CryptographicException: Bad Data

他の文字列に対して Decrypt() を呼び出しても、どの環境でも問題は発生しません。

なぜこうなった?TripleDESCryptoServiceProvider のバグですか?

明らかに、cipherString をフィルター処理して " " を拒否し、この特定の問題を回避できます。ただし、私が疑わない他の cipherString 値が DoS を引き起こすのではないかと心配しています。

更新 2011.06.28

以下は、問題を再現するための最小限のコードです。

// problem occurs when toEncryptArray is an empty array {}
      byte[] toEncryptArray = {};

      MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
      byte[] keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes("dummy_key"));
      hashmd5.Clear();

      TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
      tdes.Key = keyArray;
      tdes.Mode = CipherMode.ECB;
      tdes.Padding = PaddingMode.PKCS7;
      ICryptoTransform cTransform = tdes.CreateDecryptor();

      // the following line can crashes the ASP.NET Application Pool (may need to call multiple times).
      byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

      tdes.Clear();
4

2 に答える 2

1

問題は、前述のように、入力暗号が長さゼロの配列である場合、復号化ロジックが適切に処理しないことです。

このためのチケットが作成されました。

http://connect.microsoft.com/VisualStudio/feedback/details/678150/denial-of-service-in-tripledescryptoserviceprovider

.NET Framework 4.0 を実行している場合は問題なく動作するようです。

于 2011-07-05T19:35:13.717 に答える
0

最後のブロックは、パディングがある場所です。あなたの例では、単一のスペースが最初と最後のブロックです。DES/トリプル DES は 64 ビット ブロック暗号であり、暗号テキストは 8 バイト (64 ビット) の倍数である必要があります。

テストする環境がありませんが、パディングオプションで遊んでみましたか?パディングが一致しないため、より多くのスペースでパディングすることはできません。

一般的なパディング スキームはPKCS5です。1バイト(スペース文字に暗号化されたもの)の場合、プレーンテキストは16進数で次のようになります。

0x?? 0x07 0x07 0x07 0x07 0x07 0x07 0x07

ただし、コード サンプルでは、​​base64 入力が想定されています。つまり、入力文字列は次のようにする必要があります。

  • 12 文字の倍数
  • 有効な base64 文字列

その他の文字列は拒否できます。

値は MAC のように見えます。trueつまり、入力プレーン テキストの後にハッシュ (コード内の MD5) が続く必要があります。暗号文の変更を検出するのに役立ちます。バイナリ データを暗号化する場合に便利です。プレーン テキストの文字化けを簡単に検出できる場合は、false に設定できます。

于 2011-06-23T02:07:59.110 に答える