#android #json #security #obfuscation
#Android #json #Безопасность #запутывание
Вопрос:
Я хочу иметь возможность безопасно отправлять данные из моего приложения для Android на мой сервер, используя HTTPS и JSON.
С HTTPS я защищен от перехвата, но не от декомпиляции, поэтому я также буду использовать Proguard для обфускации.
Мой вопрос заключается в том, что JSON является простым текстовым методом отправки данных, и опытный декомпилятор сможет определить, что отправляется и принимается. Итак, каков лучший способ отправки этих данных — если я предполагаю, что в какой-то момент кто-то декомпилирует APK или JAR (в зависимости от того, как я запускаю программу).
Я мог бы запутать JSON
"x":{"xx":12345678}
Но опять же, я думаю, что это будет просто вопросом времени, когда кто-нибудь поймет, что я пытаюсь отправить временной код и т.д.
Ответ №1:
Что ж… вы не можете. Извините. Если бы вы могли разобраться с этим, музыкальная и киноиндустрия сделали бы вас героем.
Комментарии:
1. Ха-ха, хорошо. итак, вместо кода на стороне приложения мне придется придумать способ сделать это на стороне сервера.
2. Если вам действительно нужна информация на стороне клиента, вы могли бы попробовать скрыть свое намерение. Например, если вам нужна информация о времени, вы могли бы попросить клиента отправить информацию о местоположении или выполнить поиск по IP для определения местоположения и выяснить его часовой пояс.
3. Да, это то, о чем я думаю. Добавление случайных и бесполезных данных, которые кажутся полезными, а затем удаление этой серверной части данных для маскировки данных, которые мне действительно нужны. Больше безопасности за счет неизвестности, но я думаю, это нужно сделать
Ответ №2:
Нет способа предотвратить декомпиляцию. Запутывание затрудняет использование декомпилированных результатов, но специальная черная шляпа все равно сможет это использовать.
Комментарии:
1. Точно, так как же мне создать конфиденциальные данные в приложении и отправить их на сервер без чтения этих данных или обнаружения метода, для которого создаются эти конфиденциальные данные?
2. Вы могли бы использовать асимметричное шифрование (наиболее распространенное RSA), когда ваше приложение имеет только открытый ключ… вы шифруете данные с помощью открытого ключа, а у сервера есть закрытый ключ для его расшифровки. Я не уверен, что это сделало бы вещи намного более безопасными, чем просто использование https (хотя это предотвратило бы атаку «человек посередине»).
3. но при декомпиляции черная шляпа увидела бы мои данные, прежде чем передавать их через шифрование RSA. SSL (я полагаю) достаточно хорош для передачи, это создание данных, которые мне нужно / хочется защитить.
4. Вы правы, но в открытой системе вы никогда не получите полной защиты. Под управлением Android любой, обладающий лишь небольшими знаниями, может скопировать ваш apk с устройства и передать его через дизассемблер, который выдает довольно читаемый ассемблерный код. Я не думаю, что кто-нибудь еще успешно сгенерировал Java на основе этого, но сборки более чем достаточно для 1 человека — и требуется только 1 человек, чтобы поделиться своими секретами с миром : (
Ответ №3:
Лучшая комбинация, которую я нашел, — это DojoToolkit и компилятор закрытия в расширенном режиме.
Закрытие в расширенном режиме делает практически невозможным обратное проектирование кода JavaScript, даже после прохождения через улучшитель. Как только ваш код JavaScript будет запутан до неузнаваемости и не будет никакой возможности для обратного проектирования, ваш HTML не раскроет большую часть ваших секретов.
Эта ссылка для использования инструментария Dojo с компилятором закрытия в расширенном режиме для мобильных приложений:
Если вы используете компилятор Closure, вы можете затем подключить механизм шифрования, написанный на JavaScript, а затем зашифровать ваши данные в формате JSON. Из-за обфускации уровней, обеспечиваемой компилятором Closure, людям будет очень сложно перепроектировать ваш код, чтобы обнаружить ключ, который вы используете для расшифровки.