SharedPreferences存储在 Android应用中的常见位置是: /data/data/package name/shared_prefs/filename.xml 具有root权限的用户可以导航到此位置并可以更改其值.保护它的需要非常重要. 我们可以通过多少
/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格式的事实,那么您需要完全避免它.