私のウェブサイト通知を送信するためにサービスが呼び出す公開ウェブフックがあります。このWebフックでは、暗号化されたトークンが必要です。トークンを取得すると、私は定義済みのキーを使用してそれを復号化し、トークンが私が期待していたものであることを確認します。これは正常に動作します。コードを復号化できない場合の例外を防ぐには?
暗号化されていないトークンまたは悪いトークンが関数に渡されると、もちろん復号化は失敗します。これは正常です。ですが、これが発生した場合、例外が生成されることはありません。もし何人かのハッカーが私のWebフックに対して1秒間に1,000,000回の悪い要求を出し、巨大な例外を処理するために各要求が1秒かかると、サーバがクラッシュします。それは私にcs.Close()The input data is not a complete block
で例外を与えている
public static string Decrypt(string cipherText, string key)
{
string EncryptionKey = key;
cipherText = cipherText.Replace(" ", "+");
//I added this to prevent exception when trying to Convert.FromBase64String()
if (cipherText.Length % 4 != 0)
{
//cipherText must be a length that is a multiple of 4, otherwise it will fail
return null;
}
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close(); //currently giving exception HERE
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
私は意図的に非暗号化された文字列を渡す:
はここで、これまでの私の復号化コードです。私はここで正確に何が確認されているのか分からないので、それを防ぐ方法はわかりません。
文字列を復号化できない場合、例外がスローされないように、このコードをどのようにリファクタリングできますか?
あなたの 'cipherBytes'長が' encryptor.BlockSize'で割り切れることを確認する必要があると思います。実際にデータのストリームを処理しようとしている場合、これは面倒かもしれません。しかし、文字列を取っているだけであれば問題ではありません。 –
ハッカーに1,000,000件の不正なリクエストを作成させ、それでも何もしないようにしておけば、あなたはすでに間違ったことをしています。 – NullUserException