Надежное сокрытие строк на устройстве Android

Проблема: мне нужно сохранить СЕКРЕТНЫЙ ключ (строку) локально на устройстве. Как мне разумно это сделать?

Невозможно сохранить что-то на 100% надежно приватным, если оно хранится локально, но я хочу сделать так, чтобы кому-то было как можно сложнее извлечь секретный ключ. Каковы мои варианты?

Требования

  • Не должно быть задействовано никаких операций пользовательского интерфейса.
  • Секретный ключ не должен извлекаться тривиальным способом.

Возможные решения


person evanill80    schedule 27.01.2016    source источник
comment
Вы не можете. В лучшем случае вы можете получить некоторую безопасность через безвестность. Если ключ находится на устройстве, любой, кто имеет контроль над устройством, может и получит его, если захочет. Вы тратите свое время, даже беспокоясь об этом — если информация действительно секретная, не храните ее локально. Если это не так, то просто рассчитывайте на личные каталоги, чтобы защитить его от других приложений и перестать быть параноиком. Если пользователь обеспокоен, он может поставить пароль на устройство.   -  person Gabe Sechan    schedule 28.01.2016


Ответы (4)


Теперь вы можете использовать новый плагин Gradle + библиотеку для эффективного запутывания строк в классе. Пожалуйста, проверьте это здесь.

https://github.com/MichaelRocks/paranoid

Также теперь есть новый плагин, который также может запутывать ресурсы, пожалуйста, проверьте его ниже.

https://github.com/shwenzhang/AndResGuard

И помогите поделиться и проголосовать за эту замечательную информацию, чтобы больше разработчиков могли ее использовать, и, таким образом, все больше и больше разработчиков будут вносить свой вклад в дальнейшую разработку этих плагинов, и, таким образом, мы можем коллективно улучшать эти плагины и устроим кошмар для взломщиков.

person Vaishakh    schedule 05.06.2018
comment
Я попробовал paranoid и пометил @obfuscate для нескольких действий, в результате чего apk был декомпилирован с помощью JADx, а строки все еще были видны. что-то не так? - person NBaua; 06.09.2018
comment
вы добавили зависимость gradle и отметили @Obfuscate , 'capital O' - person Vaishakh; 14.11.2018

Вы можете наложить уровень шифрования на свои SharedPreferences и хранить там любые секретные ключи.

Я использовал их в качестве ссылок в одном из своих приложений и должен быть полезен и в вашем случае.

Первая ссылка: http://right-handed-monkey.blogspot.com/2014/04/obscured-shared-preferences-for-android.html

Вторая ссылка: Как лучше всего хранить пользовательские настройки в приложении для Android

person Alucard    schedule 27.01.2016
comment
Разве не нужен ключ для расшифровки и доступа к SharedPreferences? Если это так, мне нужно будет сохранить этот ключ, который вернет меня туда, где я начал. - person evanill80; 28.01.2016

Без взаимодействия с пользовательским интерфейсом лучшее, что вы можете сделать, — это зашифровать все данные с помощью ключа, который будет жестко запрограммирован в вашем приложении (или с использованием сертификата, парольная фраза которого будет жестко закодирована в вашем приложении).

Единственное, что вы можете сделать, это попытаться скрыть этот ключ.

Вы можете запутать код Java с помощью ProGuard или подобных вещей, но это все равно будет очень легко проверить, и ключ будет легко извлечен.

Чтобы еще больше запутать код, вы можете вставить свой ключ в код C и зашифровать/расшифровать через свои собственные интерфейсы JNI. Это даст вам лучшее, что вы можете получить прямо сейчас.

person Mikel Pascual    schedule 27.01.2016

Все, что вы можете попробовать, потерпит неудачу, если злоумышленник сможет загрузить ваш APK, сделать его отлаживаемым (это подразумевает его повторную подпись) и взломать его с помощью ADB. Какую бы обфускацию вы ни использовали, вы, вероятно, каким-то образом передадите ключ API-интерфейсу фреймворка, и именно здесь злоумышленник будет наблюдать. Если вам нужно сохранить секрет, используйте AndroidKeyStore для его создания, таким образом, секрет не будет извлечен (если только он не поддерживается аппаратно). По сути, ваш противник может иметь полный контроль над своим рутированным телефоном, но как только вы отправите секрет с APK, этот секрет будет потерян.

Одно из решений: создайте пару ключа-обертки в аппаратно поддерживаемом хранилище ключей Android, создать подтверждение ключа, получить серверную часть для проверки подтверждения ключа, зашифровать свой секрет и отправьте его на устройство в упакованном виде.

К сожалению, это будет работать только на устройствах Android P.

person takumar    schedule 03.10.2018