Способ решения проблемы перехвата заключается в том, что вы общаетесь по HTTPS для своего веб-сервиса. NSURLConnection сделает это легко, и все известные мне движки веб-сервисов без проблем справятся с HTTPS. Это сразу избавит вас от многих проблем.
На какой машине 100-1000x расшифровывает узкое место? Ваш сервер настолько занят, что не может выполнить асимметричное дешифрование? Вы должны делать это так редко на телефоне, что это не имеет значения. Я не говорю, что асим является ответом здесь; только то, что его производительность не должна быть проблемой для защиты одной строки, расшифрованной один раз.
Ваша служба требует SMS, чтобы все пользователи указали свой номер телефона? Вы пытаетесь автоматизировать захват номера телефона или вы позволяете пользователю вводить его самостоятельно? Автоматический захват телефонного номера через частные API (или не частные, но недокументированные данные конфигурации) и отправка его на сервер может привести к нарушению условий обслуживания. Это конкретный случай использования, от которого Apple хочет защитить пользователя. В вашем пользовательском интерфейсе вам обязательно нужно четко понимать, что вы делаете, и получить явное разрешение пользователя.
Лично я бы аутентифицировался следующим образом:
- Сервер отправляет запросный байт
- Клиент отправляет UUID, дату и хэш (UUID + вызов + userPassword + obfuscationKey + date).
- Сервер вычисляет то же самое, проверяет, что дата находится в допустимом диапазоне (30–60 с), и проверяет правильность.
- В этот момент я обычно заставляю сервер генерировать длинный, редкий, случайный идентификатор сеанса, который клиент может использовать для оставшейся части этого «сеанса» (в любом месте от следующих нескольких минут до следующего года) вместо повторной аутентификации в каждом сообщении.
ObfuscationKey - это секретный ключ, который вы жестко кодируете в своей программе и на сервере, чтобы третьим лицам было труднее создавать фиктивных клиентов. Период, , невозможен , невозможно гарантировать, что только ваш клиент может общаться с вашим сервером. Однако ключ obfuscationKey помогает, особенно на iPhone, где реверс-инжиниринг сложнее. Использование UUID также помогает, потому что он менее известен третьим лицам, чем номер телефона.
Обратите внимание на "userPassword" там. Пользователь должен аутентифицироваться, используя то, что знает только пользователь. Ни UUID, ни номер телефона не являются такими вещами.
Система выше, плюс HTTPS, должна быть простой в реализации (я делал это много раз на многих языках), иметь хорошую производительность и быть защищенной до соответствующего уровня для широкого диапазона «подходящих».