Этот пример имеет ряд различных аспектов. Я упомяну пару моментов, которые, я не думаю, были явно рассмотрены в других местах.
Защита секрета в пути
Первое, на что следует обратить внимание, это то, что для доступа к API Dropbox с использованием механизма аутентификации приложения вам необходимо передать свой ключ и секрет. Соединение - HTTPS, что означает, что вы не можете перехватить трафик, не зная сертификата TLS. Это сделано для предотвращения перехвата и считывания пакетов на пути от мобильного устройства к серверу. Для обычных пользователей это действительно хороший способ обеспечить конфиденциальность своего трафика.
В чем он не хорош, так это в предотвращении загрузки приложения злоумышленником и проверки трафика. Очень просто использовать прокси-сервер «человек посередине» для всего трафика, поступающего на мобильное устройство и выходящего из него. В этом случае для извлечения ключа и секрета приложения не требуется разборка или обратный инжиниринг кода из-за особенностей API Dropbox.
Вы могли бы сделать закрепление, которое проверяет, что сертификат TLS, который вы получаете от сервера, является тем, который вы ожидаете. Это добавляет проверку клиенту и усложняет перехват трафика. Это затруднило бы проверку трафика в полете, но проверка закрепления происходит в клиенте, поэтому, вероятно, все еще можно будет отключить проверку закрепления. Это делает все труднее, хотя.
Защищать секрет в покое
В качестве первого шага использование чего-то вроде proguard поможет сделать менее очевидным, где хранятся какие-либо секреты. Вы также можете использовать NDK для хранения ключа и секрета и отправки запросов напрямую, что значительно сократит количество людей, обладающих соответствующими навыками для извлечения информации. Дальнейшее запутывание может быть достигнуто, не сохраняя значения непосредственно в памяти в течение какого-либо промежутка времени, вы можете зашифровать их и расшифровать их непосредственно перед использованием, как предложено в другом ответе.
Более продвинутые варианты
Если вы сейчас не хотите раскрывать секрет где-либо в своем приложении и у вас есть время и деньги, чтобы инвестировать в более комплексные решения, тогда вы можете подумать о сохранении учетных данных на своих серверах (если они у вас есть). Это увеличит задержку любых вызовов к API, так как ему придется обмениваться данными через ваш сервер, и может увеличить затраты на обслуживание вашего сервиса из-за увеличения пропускной способности.
Затем вам нужно решить, как лучше всего общаться с вашими серверами, чтобы обеспечить их защиту. Это важно для предотвращения повторения всех тех же проблем с вашим внутренним API. Лучшее эмпирическое правило, которое я могу дать, - не передавать какой-либо секрет напрямую из-за угрозы «человек посередине». Вместо этого вы можете подписать трафик, используя свой секрет, и проверить целостность любых запросов, поступающих на ваш сервер. Один из стандартных способов сделать это - вычислить HMAC сообщения с секретным ключом. Я работаю в компании, у которой есть продукт для обеспечения безопасности, который также работает в этой области, поэтому такого рода вещи меня интересуют. На самом деле, вот статья в блоге одного из моих коллег, которая посвящена большей части этого.
Сколько я должен сделать?
С любым подобным советом по безопасности вам необходимо принять решение о соотношении затрат и выгод относительно того, насколько сложно вы хотите, чтобы кто-то взломал его. Если вы являетесь банком, защищающим миллионы клиентов, ваш бюджет полностью отличается от того, кто поддерживает приложение в их Свободное время. Практически невозможно помешать кому-либо нарушить вашу безопасность, но на практике немногим людям нужны все навороты, и с некоторыми основными мерами предосторожности вы можете пройти долгий путь.