Цей приклад має низку різних аспектів. Я згадаю пару моментів, які, на мою думку, не були чітко висвітлені в інших місцях.
Захист секрету в дорозі
Перше, що слід зауважити, - це те, що для доступу до API випуску скриньки за допомогою механізму аутентифікації додатків потрібно передати ваш ключ та секрет. З'єднання HTTPS, що означає, що ви не можете перехопити трафік, не знаючи сертифікату TLS. Це робиться для того, щоб людина не перехоплювала та читала пакети в дорозі від мобільного пристрою до сервера. Для звичайних користувачів це дійсно хороший спосіб забезпечення конфіденційності їх трафіку.
Те, в чому це не добре, - це перешкоджати зловмиснику завантажувати додаток та перевіряти трафік. Користуватися проксі-посередником проксі для всього трафіку на мобільний пристрій і з нього дуже просто. Для вилучення ключа програми та секрету в цьому випадку, за характером API Dropbox, не знадобиться розбирання чи зворотна інженерія коду.
Ви можете виконати фіксацію, яка перевіряє, наскільки очікується сертифікат TLS, отриманий від сервера. Це додає клієнту чек і ускладнює перехоплення трафіку. Це ускладнить перевірку трафіку в польоті, але перевірка фіксації відбувається у клієнта, тому, ймовірно, все-таки можна буде відключити тест на фіксацію. Це все ж робить важче.
Захист секрету в спокої
В якості першого кроку використання чогось типу прогуар допоможе зробити менш очевидним, де зберігаються якісь секрети. Ви також можете використовувати NDK для зберігання ключа та секрету та безпосередньо надсилання запитів, що значно зменшить кількість людей з відповідними навичками для отримання інформації. Подальша обфузація може бути досягнута, не зберігаючи значення безпосередньо в пам'яті протягом будь-якого проміжку часу, ви можете зашифрувати їх і розшифрувати їх безпосередньо перед використанням, як це запропоновано іншою відповіддю.
Більш вдосконалені варіанти
Якщо ви зараз параноїдальні щодо розміщення секрету в будь-якому місці свого додатка, і у вас є час і гроші вкласти кошти в більш комплексні рішення, то ви можете розглянути можливість зберігання облікових даних на ваших серверах (припускаючи, що у вас є). Це збільшить затримку будь-яких дзвінків до API, оскільки йому доведеться спілкуватися через ваш сервер, а також може збільшити витрати на запуск вашої послуги через збільшення пропускної здатності даних.
Тоді ви повинні вирішити, як найкраще спілкуватися зі своїми серверами, щоб гарантувати їх захист. Це важливо, щоб уникнути повторного виникнення тих самих проблем із внутрішнім API. Найкраще правило, яке я можу дати, - це не передавати жодної таємниці безпосередньо через загрозу людині в середині. Натомість ви можете підписати трафік за допомогою свого секрету та перевірити цілісність будь-яких запитів, які надходять на ваш сервер. Один із стандартних способів зробити це - обчислити HMAC повідомлення, накресленого секретом. Я працюю в компанії, яка має продукт безпеки, який також працює в цій галузі, і саме тому такі речі мене цікавлять. Насправді, ось стаття в блозі одного з моїх колег, яка стосується більшої частини цього.
Скільки я повинен зробити?
Із будь-якими порадами щодо безпеки, які вам потрібні, потрібно прийняти рішення щодо витрат / вигод щодо того, наскільки важко ви хочете, щоб хтось увірвався. Якщо ви банк, який захищає мільйони клієнтів, ваш бюджет абсолютно відрізняється від того, хто підтримує додаток у його вільний час. Заборонити комусь порушити вашу безпеку практично неможливо, але на практиці мало кому потрібні всі дзвіночки та з деякими основними запобіжними засобами можна пройти довгий шлях.