Надежное сохранение постоянных значений

Я работаю над приложением для Android, связанным с безопасным обменом данными. Я использую несколько константных значений в своем приложении и сохраняю их в классе constant.java. Я не хочу, чтобы эти значения были перепроектированы, но, несмотря на то, что я использую ProGuard для Android, для экспертов легко отменить код. Эти константы очень безопасны. Я могу использовать файл свойств или любой файл в папке res, но этот подход совсем не безопасен.

Кто-нибудь может сказать мне, как поступить? Есть ли какой-либо формат файла, в котором я могу сохранить свои константы или предотвратить обратный инжиниринг файла свойств. Есть ли какая-либо опция, например, сохранить ее в формате Python и прочитать ее из кода Android?

1 ответ

Решение

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

  • Вычислить их по некоторому алгоритму, вместо того, чтобы хранить их буквально. Даже тривиальный алгоритм может увеличить время, необходимое для извлечения констант.
  • Распределите компоненты значений по всему коду.
  • Используйте нативный код. Как правило, более трудно провести обратный инжиниринг, по крайней мере, если код и его API достаточно велики и сложны.
  • Возможно, загляните в криптографию whitebox, которая пытается встроить постоянные ключи в реализации криптографических алгоритмов таким образом, что постоянные ключи не могут быть извлечены. Это все еще сфера исследований и высококачественных коммерческих решений.

Вы можете получить некоторые идеи, которые вы можете применить самостоятельно из моей презентации и из презентации Скотта Александра- Бауна на Droidcon в Лондоне.

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

Насколько эффективна защита, зависит от времени и усилий, которые вы можете инвестировать, от стоимости вашего продукта, от времени и усилий, которые хакеры готовы потратить, от их опыта и т. Д.

Аналогичный вопрос: Лучшая практика хранения закрытых ключей API в Android

(Я разработчик ProGuard и DexGuard)

Ответ: не делайте этого!. Секретные константы никогда не являются секретом. Вы всегда должны предполагать, что ваш противник достаточно умен, чтобы восстановить то, что вы спрятали за своей дымовой завесой.

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

Ваш сервер генерирует закрытый и открытый ключи, а затем вы включаете открытый ключ при установке приложений. Неважно, найдет ли это злоумышленник. Все, что это позволяет вашему приложению, - это безопасно отправлять сообщение на сервер, и ТОЛЬКО сервер может его расшифровать, потому что только у них есть закрытый ключ.

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

Теперь вы можете безопасно отправлять сообщения на сервер, используя открытый ключ сервера, а сервер может безопасно отправлять вам сообщения, используя ваш открытый ключ.

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

Другие вопросы по тегам