Какой смысл шифровать что-либо в Android (или Java), если исходный код может быть переработан? - PullRequest
8 голосов
/ 19 августа 2011

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

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

Я что-то упустил?

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 19 августа 2011

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

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

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

3 голосов
/ 19 августа 2011

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

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

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

2 голосов
/ 23 августа 2011

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

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

1 голос
/ 19 августа 2011

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

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

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

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

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

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

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

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

0 голосов
/ 19 августа 2011

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

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

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

...