Как безопасно сохранить SharedPreference на устройстве Android?
У меня есть несколько SharedPreferences, которые я хотел бы сохранить на самом устройстве как можно надежнее. Я ничего не знаю о безопасности, но из небольшого исследования я обнаружил, что то, что я хочу, - это нечто, называемое "обфускатором". Это правильно? Это отличается от "шифрования", или я хочу сделать оба? Я также обнаружил, что могу использовать AESObfuscator или ProGuard. Какие есть отличия? Есть еще варианты? Какой я должен использовать?
Я, очевидно, очень плохо знаком с безопасностью, поэтому любые учебники или другие ссылки будут полезны.
4 ответа
Связанный AESObfuscator шифрует строки статическим ключом, чтобы их можно было сохранить в общих префиксах, и не сразу становится понятно, что это такое. Это отличается от обфускатора кода, такого как ProGuard, который искажает имена методов и переменных в вашем коде, чтобы усложнить обратный инжиниринг. Он называется "обфускация", а не "encryptoin", потому что ключ находится в приложении, и его довольно легко восстановить (путем извлечения ключа и дешифрования). Запутывание общих привилегий усложнит чтение и изменение строк, но не сделает невозможным. Если вы в порядке с таким уровнем защиты, используйте этот метод. Использование обфускации кода также является хорошей идеей, поэтому вы захотите использовать оба.
Единственный поддерживаемый способ сделать "невозможным" дешифрование строк - это вводить пароль каждый раз, когда пользователь использует приложение, и извлекать из него ключ шифрования. Это работает, но, разумеется, не очень удобно для пользователя. Если вы заинтересованы, вот некоторые детали.
Обфускатор ничего не сделает для вас в этой ситуации, поскольку все, что он делает, по сути, переименовывает переменные в нечитаемые человеком имена.
Что вы хотите сделать, это зашифровать данные, как они сохраняются в вашем SharedPreferences
и расшифровывать его, когда вы читаете его.
Пример этой идеи Encrypted SharedPrefs, я не могу сказать, насколько он эффективен, я не использовал выше.
Я провел некоторое исследование по этой проблеме, когда мне нужно было "спрятать" некоторые URL в файлах Java. В вашем случае это будет какой-то секретный ключ для шифрования ваших строк. Существует проблема, заключающаяся в том, что весь код в Java/Android может быть прочитан любым, кто использует какой-либо метод обратного инжиниринга. Иногда это довольно легко, и такие обфускаторы, как ProGuard, делают его немного сложнее. Таким образом, ваш ключ шифрования будет виден всем. Есть некоторые (платные) обфускаторы, которые могут скрывать даже строки в файлах Java, но я не уверен, насколько они надежны.
Короче говоря - сохраните ваши строки вне устройства на вашем сервере и используйте какое-то безопасное соединение между вашим устройством и сервером (SSL). Или вы можете попросить ваш сервер зашифровать его и отправить обратно вам. Если вы сохраните свой секретный ключ на устройстве, вы никогда не сможете быть уверены, что кто-то обратный инжиниринг использует для его чтения.
Единственный безопасный способ - не хранить конфиденциальную информацию на устройстве - если она там есть, она будет извлечена при условии, что ее ценность больше, чем время кого-то, кто работает (а опытные дети в стране третьего мира действительно дешевы, в денежные условия и богатые по времени). Вы можете посмотреть, как это делается с помощью OAuth - эта технология позволяет регистрировать сторонние приложения (например) в твиттере, не подвергая риску учетные данные безопасности (или приложение, когда-либо видевшее их)
Одна хорошая библиотека: http://code.google.com/p/oauth-signpost/