如何保护Android共享首选项?

SharedPreferences存储在 Android应用中的常见位置是:

/data/data/<package name>/shared_prefs/<filename.xml>

具有root权限的用户可以导航到此位置并可以更改其值.保护它的需要非常重要.

我们可以通过多少种方式加密整个shared_pref的xml文件?

我们都知道我们可以在shared_pref的xml文件中加密和保存数据,但这不仅100%安全,因此需要使用密钥加密整个文件.需要帮助了解加密整个xml文件的各种方法.这是一般性问题,这里讨论的各种加密方法可以帮助所有开发人员保护应用程序.

您应该注意Android的共享首选项是基于XML键值的.你无法改变这个事实(因为它会破坏它的解析器),最多你可以加密密钥和值,所以root用户可以阅读,但不会有任何想法他正在读什么.

为此,您可以使用这样的简单加密

public static String encrypt(String input) {
    // This is base64 encoding, which is not an encryption
    return Base64.encodeToString(input.getBytes(), Base64.DEFAULT);
}

public static String decrypt(String input) {
    return new String(Base64.decode(input, Base64.DEFAULT));
}

这就是你如何使用它

// Write
SharedPreferences preferences = getSharedPreferences("some_prefs_name", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(encrypt("password"), encrypt("dummypass"));
editor.apply(); // Or commit if targeting old devices

// Read
SharedPreferences preferences = getSharedPreferences("some_prefs_name", MODE_PRIVATE);
String passEncrypted = preferences.getString(encrypt("password"), encrypt("default"));
String pass = decrypt(passEncrypted);

你应该知道,SharedPreferences永远不会被构建为安全的,它只是一种持久化数据的简单方法.

您应该也知道我使用的加密并不是最安全的,但它很简单.

有几个库可以提供更好的加密,就像这些

> https://github.com/patrickfav/armadillo
> https://github.com/scottyab/secure-preferences
> https://github.com/ophio/secure-preferences

但他们都认为文件的格式仍然是XML,而且它是基于键值的.你无法改变这一事实.见下文.

cat /data/data/your.package.application/shared_prefs/prefs-test.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="JopRH053b7Ogw17Yxmh7Og==">0AB7Y28XEvbQcnXpEZ4j9PtqzFLtm2V3KBXjTO1V704=</string>
</map>

The key is "hemmelighet" and the value is "dette er en hemmelighet".

如果安全问题超出了SharedPreferences仍然是基于键值并且采用XML格式的事实,那么您需要完全避免它.

相关文章
相关标签/搜索