Надежное сохранение постоянных значений
Я работаю над приложением для Android, связанным с безопасным обменом данными. Я использую несколько константных значений в своем приложении и сохраняю их в классе constant.java. Я не хочу, чтобы эти значения были перепроектированы, но, несмотря на то, что я использую ProGuard для Android, для экспертов легко отменить код. Эти константы очень безопасны. Я могу использовать файл свойств или любой файл в папке res, но этот подход совсем не безопасен.
Кто-нибудь может сказать мне, как поступить? Есть ли какой-либо формат файла, в котором я могу сохранить свои константы или предотвратить обратный инжиниринг файла свойств. Есть ли какая-либо опция, например, сохранить ее в формате Python и прочитать ее из кода Android?
1 ответ
Принципиально невозможно безопасно хранить секретные константы на устройстве, поскольку хакеры могут восстановить их с помощью статического и динамического анализа. Вы можете только сделать это немного сложнее, запутав значения:
- Вычислить их по некоторому алгоритму, вместо того, чтобы хранить их буквально. Даже тривиальный алгоритм может увеличить время, необходимое для извлечения констант.
- Распределите компоненты значений по всему коду.
- Используйте нативный код. Как правило, более трудно провести обратный инжиниринг, по крайней мере, если код и его API достаточно велики и сложны.
- Возможно, загляните в криптографию whitebox, которая пытается встроить постоянные ключи в реализации криптографических алгоритмов таким образом, что постоянные ключи не могут быть извлечены. Это все еще сфера исследований и высококачественных коммерческих решений.
Вы можете получить некоторые идеи, которые вы можете применить самостоятельно из моей презентации и из презентации Скотта Александра- Бауна на Droidcon в Лондоне.
Вы также можете использовать коммерческий обфускатор, такой как расширенная версия ProGuard, DexGuard, для защиты кода с помощью таких методов, как строковое шифрование и классовое шифрование.
Насколько эффективна защита, зависит от времени и усилий, которые вы можете инвестировать, от стоимости вашего продукта, от времени и усилий, которые хакеры готовы потратить, от их опыта и т. Д.
Аналогичный вопрос: Лучшая практика хранения закрытых ключей API в Android
(Я разработчик ProGuard и DexGuard)
Ответ: не делайте этого!. Секретные константы никогда не являются секретом. Вы всегда должны предполагать, что ваш противник достаточно умен, чтобы восстановить то, что вы спрятали за своей дымовой завесой.
И в любом случае этого делать не нужно. Вместо этого для безопасного обмена данными используйте инфраструктуру открытого ключа. Вот примерно как это работает.
Ваш сервер генерирует закрытый и открытый ключи, а затем вы включаете открытый ключ при установке приложений. Неважно, найдет ли это злоумышленник. Все, что это позволяет вашему приложению, - это безопасно отправлять сообщение на сервер, и ТОЛЬКО сервер может его расшифровать, потому что только у них есть закрытый ключ.
Итак, первое, что должно сделать ваше приложение, - это сгенерировать закрытый и открытый ключи. Используйте любой защищенный шкафчик для хранения, который предоставляет ваша ОС, чтобы хранить закрытый ключ в безопасности. Это не неуязвимо, но намного безопаснее, чем все, что вы придумаете. А затем отправьте открытый ключ на свой сервер.
Теперь вы можете безопасно отправлять сообщения на сервер, используя открытый ключ сервера, а сервер может безопасно отправлять вам сообщения, используя ваш открытый ключ.
Не пытайтесь изобретать велосипед здесь. Исследователи безопасности с серьезной квалификацией в сложной математике и компьютерных науках тратят всю жизнь на создание этих систем, и если вы взорвете свою реализацию, вы оставите ее открытой для хакеров, которые могут взломать и украсть ваши данные. Используйте широко распространенную библиотеку шифрования PKI, такую как OpenSSL, и будьте в курсе всех источников предупреждений безопасности, относящихся к этой библиотеке.