Я хотел бы создать файл, в котором хранятся некоторые данные, к которым можно получить доступ только моим приложением. Внешние пользователи не должны иметь доступ к этому файлу или вносить какие-либо изменения в него. Я буду хранить ключ в файле, доступ к которому может получить доступ при необходимости.
Чтобы создать частный файл приложения (который не читается другими приложениями), вы должны использовать Context.openFileOutput() с флагом MODE_PRIVATE.
Если вы обеспокоены, вы можете обернуть возвращаемый InputStream в CiperOutputStream и зашифровать содержимое.
Если вы храните ключи в стандартном криптовом формате (X.509 или PKCS # 12), вы можете использовать новый API KeyChain, введенный в ICS.
используйте Environment.getDataDirectory(), http://developer.android.com/reference/android/os/Environment.html#getDataDirectory()
это дает объект File, который является путем доступа к частному каталогу данных конкретного приложения. файлы, созданные в них, принадлежат вашему идентификатору пользователя приложения, не позволяя любому другому приложению получать доступ к ним.
File myPrivateFile = new File(Environment.getDataDirectory(), context.getPackageName() + File.separator + "secret.txt");
обратите внимание, что если устройство укоренилось, все ставки отключены. корневой процесс может читать любой файл на устройстве. лучшее, что вы можете сделать, это хранить информацию только для пользователя устройства. таким образом, если он скомпрометирован, скомпрометирована только одна учетная запись пользователя. другими словами, не хранить учетные данные, ключи, токены доступа и т.д., которые позволяли бы злоумышленнику получить доступ к серверу, где он мог бы украсть данные для других пользователей.
Чтобы открыть файл из частной папки приложения, можно использовать этот путь к файлу:
File myFilePath = new File(getContext().getFilesDir() + File.separator + "myFile")
Вы можете проверить, существует if(myFilePath.exists())
файл if(myFilePath.exists())
...
Чтобы сохранить текстовый файл в каталоге частных приложений
FileOutputStream fos = null;
try {
fos = getContext().openFileOutput("myFile",Context.MODE_PRIVATE);
} catch (FileNotFoundException e) { }
try {
fos.write(myTextString.getBytes());
} catch (IOException e) { }
try {
fos.close();
} catch (IOException e) { }
Чтобы сохранить изображение в каталоге частного приложения:
try {
myBitmapImage.compress(CompressFormat.JPG, 90,
openFileOutput("myimage.jpg", MODE_PRIVATE));
} catch (Exception e) { }
Почему бы просто не сохранить его в SharedPreference?
Сделайте свой SharedPreference
конфиденциальным для своей деятельности, позвонив..
getSharedPreferences(yourfile, MODE_PRIVATE);
Это гарантирует, что только ваша Activity
может получить доступ к этому SharedPreference
.
Лучше всего хранить зашифрованный файл и дешифровать его во время выполнения, поэтому даже встроенный телефон не сможет читать ваши данные, даже если у него есть доступ к нему. Конечно, это условие куриного яйца (где вы храните свой ключ для зашифрованного файла), и единственное, что лучше, чем положить ключ в переменную, - это сгенерировать эту ключевую рабочую среду с использованием какого-то неясного метода (см. Это)