Подводные камни System.Security.Cryptography

Криптография является одной из немногих предметных областей, с которой рано или поздно сталкивается подавляющее большинство разработчиков. Вам уже доводилось использовать генераторы случайных чисел, работать с цифровыми подписями, хранить пользовательские пароли или, на худой конец, шифровать данные? А вы уверены, что не допустили при этом ошибок, повлиявших на защищенность приложения? Проверьте себя: сколько уязвимостей вы видите в следующем фрагменте кода?

private static bool IsValidSignature(string data, string signature) {
  var bytes = Encoding.ASCII.GetBytes("eCTR4rhYQVNwn78j" + data);
  var hash = MD5.Create().ComputeHash(bytes);
  return BitConverter.ToString(hash) == signature;
}
...
if (IsValidSignature(Request["data"], Request["signature"])) {
  var decryptor = Aes.Create() {
    BlockSize = 128;
    Key = Encoding.ASCII.GetBytes("YtGDn6mvAHbp5X7C");
    IV = Encoding.ASCII.GetBytes("mHMUYSjiVxo4wp9R");
  }.CreateDecryptor();
}

Если меньше 5, то вам определенно стоит посетить этот доклад. На нем, без лишнего математического хардкора, мы поговорим о типичных сценариях использования средств криптографии в .NET-приложениях, рассмотрим лучшие практики решения наиболее часто встречающихся задач, разберем типовые уязвимости и посмотрим демки нескольких реальных атак на наиболее интересные из них.

Владимир Кочетков

Владимир Кочетков, Positive Technologies

Тимлид проекта разработки анализатора защищенности кода PT Application Inspector, C#-разработчик, AppSec-исследователь.

×