Какой смысл шифровать anyting в Android (или Java), если исходный код может быть изменен в обратном порядке?

Android и Java предоставляют криптографический API, который относительно прост в использовании для криптозащитных экспертов.

Но так как мы знаем, что никакой код не может быть действительно защищен от обратной инженерии, особенно строковых констант, используемых в качестве семян или разделяемых секретов, мне интересно: какой смысл проходить испытание зашифрования и дешифрования в приложениях Android?

Я что-то упускаю?

Попытка сделать мой вопрос яснее и конкретнее: предположим, что у меня есть приложение, в котором некоторые строки, используемые кодом и кодом (т. Е. Не пользовательские данные), должны быть секретными: один из них заключается в том, чтобы хранить их в зашифрованном виде в скомпилированном .apk и дешифровать их (используя запущенный жестко запрограммированный пароль) во время выполнения. Другим подходом было бы хранить их в зашифрованном виде на удаленном сервере, извлекать их (через Интернет) и дешифровать (используя общий пароль) их во время выполнения.

Я не вижу большой разницы между ними, поскольку оба требуют, чтобы «секретный ключ» присутствовал в коде (обратный инженер).

Есть ли решение этой проблемы?

Если нет решения, зачем вообще шифровать?

Solutions Collecting From Web of "Какой смысл шифровать anyting в Android (или Java), если исходный код может быть изменен в обратном порядке?"

Это не проблема с Android или Java. Все может быть отменено, это просто сложнее, если это собственный код. И имейте в виду, что им даже не нужно менять его: вы должны в конечном итоге расшифровать данные в памяти, чтобы манипулировать им. На данный момент злоумышленник может просто взять дамп памяти, и они получат ваши данные. Если у них есть физический доступ к устройству, и вы управляете данными в программном обеспечении, вы действительно ничего не можете сделать, чтобы остановить их. Решением для этого является использование специализированного аппаратного модуля (HSM), который является защищенным от несанкционированного доступа или, по крайней мере, несанкционированным (если кто-то его испортит, он либо удаляет все данные, либо, по крайней мере, сохраняет некоторые журналы события). Они бывают разных форм и размеров: от смарт-карт до подключенных к сети устройств, которые стоят дорого . В настоящее время он недоступен для Android, но, возможно, он получит что-то похожее на TPM, так что вы можете безопасно хранить свои ключи и выполнять криптографические операции на оборудовании .

Поэтому рассмотрите, насколько секретны ваши данные, и выберите адекватный уровень защиты.

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

Общий секрет в crypto API – это не то, что вы сохранили бы в приложении (как вы говорите, это было бы уязвимо для обратного проектирования), хотя, возможно, не так уязвимы, как вы ожидали, обфускация довольно проста).

Представьте себе, что вы хотели создать / прочитать зашифрованные файлы на своем телефоне (для вашего секретного списка продуктов).

После его создания вы сохраняете его с помощью мастер-пароля (который немедленно отбрасывается программой). Затем, когда вы хотите прочитать его, вы должны повторно ввести свой главный пароль. Это общий секрет, на который ссылается API, и он полностью тангенциальен для обратного проектирования.

Проблема, которую вы описываете, несколько похожа на сохранение главного пароля для проблемы с менеджером паролей.

В этом случае предлагаемое решение использует соль для хэшей паролей .

Ateiob Каждый раз, когда вы храните главный пароль в приложении, вы действительно просто усложняете доступ неавторизованных пользователей к зашифрованным данным.

Во-первых, мы можем согласиться с тем, что шифрование данных с помощью «главного ключа», встроенного в приложение, и сохранение данных на телефоне открыто для того, чтобы иметь «главный ключ» с обратной обработкой и дешифрование данных.

Во-вторых, я думаю, мы можем согласиться с тем, что шифрование данных с секретным паролем, а затем удаление секретного пароля должно быть достаточно безопасным, используя надежное шифрование, 256-битные ключи и надежные пароли. Оба метода применяются к программированию на мобильных устройствах. На самом деле, iOS, поддерживает BOTH потребности из коробки.

 [keychainData setObject:@"password" forKey:(id)kSecValueData]; 

Возможно, пример реального мира может помочь.

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

Таким образом, есть два пароля, мастер-пароль, встроенный в приложение для временного краткосрочного шифрования и секретный пароль, который обычно должен вводиться пользователем, для долговременных сохраняемых зашифрованных данных.

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

Предполагается, что у злоумышленника есть копия вашего кода. Секретность ваших данных должна полностью зависеть от ключа. См . Принцип Керкхоффса .

Чтобы сохранить секретный ключ, вы должны отделить его от своего кода. Запомни. Держите его на листе бумаги в кошельке. Храните его на USB-накопителе, который обычно хранится в сейфе. Используйте программу, такую ​​как PasswordSafe . Есть много возможностей.

Разумеется, можно заставить любого атакующего прокладывать себе путь через множество слоев ключей, чтобы добраться до того, что ей действительно нужно. PasswordSafe и тому подобное – один из таких вариантов. Вы заметите, что такие программы не дают вам возможность «запомнить ваш пароль» для вас.