Безпечний зв’язок додатка iPhone з сервером


14

Який був би найкращий підхід для досягнення приватного спілкування між моїм додатком iOS та його серверним компонентом? Чи достатньо одного єдиного незмінного «секретного ключа», запеченого у джерелі програми, чи мені потрібно якось динамічно налаштовувати покоління таких клавіш «рукостискання»?

Сам сервер не має доступу до будь-яких конфіденційних даних, тому навіть якщо користувач потрапить на деякі приватні кінцеві точки, він їх нікуди не дістане, але я просто хочу, щоб вони були приховані від загальнодоступних. В основному я хочу ігнорувати всі запити, що потрапляють на певні маршрути, якщо вони не надходять з мого додатка iOS.

Серверний компонент працює на RoR, якщо це важливо.

Відповіді:


8

Ви не можете ефективно відхиляти з'єднання, якщо не надасте кожному клієнту приватний ключ, який ви можете індивідуально відкликати. Але це, мабуть, надмірність. Вам не потрібно бронезахисне рішення, якщо більшість людей не потрудиться стріляти з кулі.

Це питання безпеки, тому опишемо модель загрози та стратегії пом'якшення.

Припустимо, у вас є URL-адреса, яка може спричинити за собою помітну вартість (наприклад, вартість обробки), і ви хочете захистити її як від простої атаки DoS, так і від програм copycat.

Використовуйте SSL, щоб приховати з'єднання від легкого аналізу. Використовуйте номер незахищеного порту, послідовність переспрямування, обмін файлами cookie, щоб трохи ускладнити з'єднання, перш ніж зробити дорогу частину запиту. Використовуйте секретний код, записаний у вашій програмі, щоб сервер знав, що він повинен прийняти з'єднання.

Тепер хтось не може дізнатись дорогої для потрапляння URL просто за допомогою запуску sniffer пакетів або перегляду рядків у коді, схожих на URL. Потенційний зловмисник повинен декомпілювати вашу програму.

Ви дійсно не можете захистити свій код від декомпіляції та / або запуску під налагоджувачем. Зрештою зловмисник дізнається секретний ключ та послідовність з'єднання.

Ви помічаєте, що починаєте отримувати запити на маршрутизацію за вашою дорогою URL-адресою: або у формі атаки, або у формі програми copycat, яка має доступ до вашої служби для запуску, або, можливо, код експлуатації публічно публікується. Ти не можеш сказати, що це неправдивий запит із законного запиту.

Створіть безкоштовне незначне оновлення для вашої програми за допомогою іншого секретного ключа. Він повинен містити іншу дорогу URL-адресу, яка обслуговує ті самі дані, що й URL-адреса, що скомпрометована. Деякий час зробіть обидві URL-адреси доступними.

Перегляньте свій базовий перемикач на оновлену версію Вимкніть скомпрометовану дорогу URL-адресу і врешті-решт її 404. Ви щойно пом'якшили порушення безпеки, сподіваємось, не втрачаючи занадто багато. Назад до квадратного.

Відмова: Я не є експертом з безпеки.


Якщо у користувача є додаток, він може виявити дорогу URL-адресу навіть у випадку над SSL (клієнт має повний контроль над сертифікатами тощо). Це змушує решту аргументів не згадувати, це класичний приклад проти безпеки через неясність.
aleemb

@aleemb: Безумовно, ви не можете зберігати дорогу URL повністю таємницею. Рішучий нападник виявить це. Сенс полягає в тому, щоб зробити це відкриття також дорогим, так що "сценарій малюка" мав би важкий час, і, таким чином, менше стимулів його викопати та використати, а також зробити можливим пом'якшення наслідків. Якщо вартість вашого пом’якшення є досить низькою, а вартість виявлення для зловмисника висока, порівняно з будь-яким виграшем, який зловмисник може отримати від використання дорогої URL-адреси, напад стає безглуздим. Це, знову ж таки, не сувора безпека.
9000

5

У вас є класична проблема, яку насправді неможливо вирішити.

Щоб забезпечити просту конфіденційність (тобто переконатися, що ваші дані не можуть бути відкладені або змінені під час транзиту), ви можете зробити все через SSL та надати серверу належним чином виданий сертифікат від CA, який iPhone визнає.

Однак для авторизації немає хорошого рішення, яке б на 100% гарантувало, що ніхто, крім вашої програми, не може отримати доступ до API. Запропонував Ваше рішення буде працювати, за винятком:

  • кожен, хто завантажив вашу програму, обов'язково має у своєму розпорядженні приватний ключ
  • якщо їм якимось чином вдасться розпакувати вашу програму та декомпілювати її, вони матимуть приватний ключ у простому тексті
  • Щойно вони мають приватний ключ у простому тексті, вони можуть використовувати його для підписання власних шкідливих запитів.

Не обійтися цим. Це не сказати, що ви не могли скористатися таким підходом, але зрозумійте, що це не дурно. Саме ця проблема робить DRM абсолютно неефективною .


0

Це те, для чого TLS і SSL . Будь-який із них може створити захищене з'єднання без необхідності фіксованого секретного ключа. Прочитайте розділ Опис на пов’язаній сторінці, щоб дізнатися, як це робити.

Ефективний спосіб отримати перевагу TLS / SSL, не виконуючи багато (будь-якої) роботи, полягає в тому, щоб ваш сервер реалізував веб-сервіс, до якого клієнт звертається за допомогою протоколу HTTPS. HTTPS - це лише HTTP через захищене з'єднання, і система завантаження URL-адрес в iOS реалізує його для вас.


Хоча HTTPS приховує зв’язок від підслуховування, це не заважає випадковим клієнтам підключатися до кінцевої точки, якщо тільки сервер не вимагає сертифікат клієнта. Це може бути "запечене" в додатку і вимагати певних знань для отримання.
9000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.