Как безопасно сохранить пароль в Android-приложении при его сборке?
Да, я знаю про KeyStore и AccountManager. Но они работают только при кейсе, когда пароли получаются во время работы пользователя. Тогда, получив, их можно туда безопасно сохранить и больше не светить нигде.
У меня же пароль известен сразу, при разработке. Он один и меняться не будет. Нужно как-то сохранить его так, чтобы он был известен лишь приложению в рантайме, а в коде его найти было нельзя.
Если конкретнее, то это нужно для авторизации в Dropbox API. Там есть пара из публичного и приватного ключей. Публичный там хранится вообще в манифесте, но это нормально. А вот приватный хотелось бы спрятать из кода. (В оффдоках они объявляют просто константу с ним, никак не пряча.)
На всякий случай поясню, чем опасно открытое хранение такого ключа. Если злоумышленник найдёт его, он сможет создать клон моего приложения, который получит доступ к папкам с данными у всех моих пользователей, и сделать с их файлами всё, что угодно.
-----
Пояснение!
Почему-то абсолютно все поняли меня неверно. Поэтому объясню, как устроена работа с Dropbox API вообще и в моём приложении в частности (по другому там просто не сделать).
В админке разработчика Dropbox создаётся так называемое Dropbox-приложение. Это Dropbox-приложение не содержит кода, а представляет из себя по сути учётку доступа. И характеризуется двумя ключами - приватным и публичным.
Когда я хочу встроить в Android-приложение доступ к Dropbox API, я должен представляться вышеописанным Dropbox-приложением. При первом обращении я отправляю оба ключа (публичный и приватный), и дальше начинается стандартная OAuth 2 аутентификация.
У пользователя моего приложения при этом откроется либо официальное Android-приложение Dropbox, либо официальный сайт Dropbox, где сначала ему будет предложено авторизоваться в своём аккаунте (мне никакие его пароли не отправляются, я вообще не вижу этого шага), а после пользователь должен будет дать разрешение моему Dropbox-приложению на доступ к своему аккаунту.
Только после этого моё приложение получит доступ к папке пользователя в его Dropbox. При этом этот доступ будет ограничен исключительно папкой этого приложения, никакие другие файлы и папки снаружи не будут ему доступны.
Таким образом моё Android-приложение получает индивидуальный доступ к своей папке в каждом конкретном аккаунте Dropbox, который одобрил моё Dropbox-приложение.
Никакого перекрёстного владения файлами между аккаунтами нет и быть не может! Я вообще не понимаю, откуда все это взяли! О_О В Dropbox API такого режима вообще нет!
Проблема
Теперь опишу проблему ещё раз. Так как моё Dropbox-приложение, которое требуется для доступа, определяется парой из публичного и приватного ключей, то любой, у кого есть эти ключи, может представиться моим Dropbox-приложением и получить доступ к файлам моих пользователей.
Да, ему для этого придётся либо установить свою малварь на телефоны пользователей, либо создать сайт и заманить на него пользоватей. Но тем не менее это возможно и весьма просто осуществляется.
Именно поэтому Dropbox пишет, что приватный ключ нельзя никому показывать. Именно поэтому даже на странице, где он написан, ключ скрыт, и чтобы его скопировать, надо нажать отдельную кнопку.
Вопрос
Так как же мне сохранить этот приватный ключ внутри моего приложения? Ведь он будет легко доступен через декомпиляцию.
Хранить данные разных пользователей под одним аккаунтом Dropbox - это самоубийство!
Мне даже сложно представить менее безопасный или более опасный подход.
От такой дыры в защите не спасет никакое прятание паролей.
Тем более, что попытка что-то спрятать в общедоступном месте бессмысленна сама по себе.
Никак. Это неверный подход в принципе. При желании найти ваш ключ проблемой не будет.
Один дропбокс для пользователей? СЕРЬЕЗНО?! С режимом чтения-записи для всех? Вы там что, БД хранить собрались?
Один на всех - очень, очень плохая идея! Посмотрите лучше в стороноу Dropbox API (если они есть, я хз). Пусть каждый хранит свои файлы у себя в аккаунте, а при установке приложения логинится туда самостоятельно.
Еще раз повторюсь: очень плохая идея! Даже если вы зашьете его незаметно в KeyStore, то есть риск что его все равно получат: https://habrahabr.ru/post/169717/
Вы неверно меня поняли. Я добавил в вопрос пояснение о работе с Dropbox API (которое я изначально и использовал, о чём упомянул сразу же). Никакого перекрёстного владения файлами нет.