Ответ
Для защиты от MITM-атак и анализа трафика применялся комплексный подход:
-
Обязательное использование HTTPS с Certificate Pinning
- Фиксация ожидаемого сертификата или его публичного ключа в коде приложения.
- Пример реализации делегата для
URLSession:class PinningDelegate: NSObject, URLSessionDelegate { func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { guard let serverTrust = challenge.protectionSpace.serverTrust, let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0) else { completionHandler(.cancelAuthenticationChallenge, nil) return } // Сравнение с локально сохраненным ключом/сертификатом // ... } }
-
Шифрование чувствительных данных на стороне клиента перед отправкой (например, с помощью AES) для защиты даже при компрометации TLS.
-
Настройка App Transport Security (ATS) в
Info.plistдля полного запрета незашифрованных HTTP-соединений. -
Дополнительные меры для критичных API:
- Подпись запросов с использованием секретного ключа и временной метки.
- Использование одноразовых токенов (nonce) для защиты от повторного воспроизведения запросов (replay-атак).
- Отключение поддержки прокси в конфигурации
URLSessionдля предотвращения перехвата трафика через локальные прокси.