Куда помещать пароль в HTTP запросе, чтобы он был зашифрован и не был виден сниферу
Что проверяют
Понимаете ли вы, что пароль прячет от сниффера TLS, а не выбор между телом и заголовком, и знаете ли, какие механизмы iOS за этим следят. Следом обычно спрашивают про certificate pinning и про то, как Charles или Proxyman видят HTTPS-трафик.
Как отвечать
При HTTPS весь запрос шифруется целиком: путь, параметры, заголовки, тело. Перехватчик в сети видит только адреса, объём трафика и домен через SNI. Поэтому ответ на вопрос «куда положить» такой: в тело POST по HTTPS, а место выбирают из соображений логов, а не сниффера.
- строка запроса: не годится, URL пишется в логи серверов и прокси;
- тело запроса: JSON в
URLRequest.httpBodyс методомPOST, стандартный вариант для логина; - заголовок
Authorization: для Basic Auth. Base64 не шифрует, защиту даёт только TLS.
Что есть на стороне iOS:
- App Transport Security:
URLSessionпо умолчанию не пускает запросы по голому HTTP и требует TLS 1.2 или новее. КлючNSAllowsArbitraryLoadsвInfo.plistотключает защиту целиком, и в релизной сборке ему не место; - certificate pinning: через
URLSessionDelegateи методurlSession(_:didReceive:completionHandler:)с проверкой ключа сервера или декларативно черезNSPinnedDomainsвInfo.plist. Он защищает от перехвата с подложенным корневым сертификатом, именно так трафик читают Charles и Proxyman; - после входа: сервер возвращает токен, его хранят в Keychain, а пароль больше не отправляют и нигде не сохраняют.
UserDefaultsдля секретов не подходит, это обычный plist.
На сервере пароль хранится хэшем через bcrypt или Argon2, но это защита от утечки базы, а не от сниффера.
Где спотыкаются
Говорят, что пароль в теле передавать нельзя и нужен токен. Токен выдаётся в ответ на пароль, так что хотя бы один раз пароль всё равно уходит на сервер, и внутри TLS это нормально.
Хэшируют пароль на клиенте и считают, что трафик теперь защищён. Перехваченный хэш работает ровно как пароль.
Добавляют исключение ATS или отключают проверку сертификата в делегате ради тестового стенда и выпускают это в App Store. Тогда перехват с поддельным сертификатом снова работает у любого пользователя.