@thewizardplusplus

Как безопасно сохранить пароль в 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 пишет, что приватный ключ нельзя никому показывать. Именно поэтому даже на странице, где он написан, ключ скрыт, и чтобы его скопировать, надо нажать отдельную кнопку.

Вопрос

Так как же мне сохранить этот приватный ключ внутри моего приложения? Ведь он будет легко доступен через декомпиляцию.
  • Вопрос задан
  • 701 просмотр
Пригласить эксперта
Ответы на вопрос 2
@LiguidCool
Никак. Это неверный подход в принципе. При желании найти ваш ключ проблемой не будет.
Один дропбокс для пользователей? СЕРЬЕЗНО?! С режимом чтения-записи для всех? Вы там что, БД хранить собрались?
Ответ написан
mitaichik
@mitaichik
Один на всех - очень, очень плохая идея! Посмотрите лучше в стороноу Dropbox API (если они есть, я хз). Пусть каждый хранит свои файлы у себя в аккаунте, а при установке приложения логинится туда самостоятельно.

Еще раз повторюсь: очень плохая идея! Даже если вы зашьете его незаметно в KeyStore, то есть риск что его все равно получат: https://habrahabr.ru/post/169717/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы