标题理论概述
存储数据对于移动应用程序至关重要,应将尽可能少的敏感数据存储在永久性本地存储中,但是在大多数实际场景中,必须存储某种类型的用户数据。如果敏感数据没有受到应用程序适当保护,就很容易受到攻击。
保护身份验证Token、私人信息和其他敏感数据是移动应用安全的关键。
保存数据的准则概括:公共数据应该对所有人可用,但敏感和私有数据必须受到保护,或者更好的是将敏感数据存储在设备存储之外。
除了保护敏感数据之外,还需要确保从任务存储源读取的数据都应该经过验证。
数据存储方法概述
Android根据用户需求提供了多种数据存储的方法,以下介绍 Android平台常用的几种数据存储方法:
Shared Preferences
SQLite Databases
Firebase Databases
Realm Databases
Internal Storage
External Storage
Keystore
Shared Preferences
SharedPreferences API通常用于永久保存小的集合,用Key- Value的形式存储。数据存储通过SharedPreferences 对象写入XML文件。SharedPreferences 对象有两种模式 world-readable(所有App都可以访问)和private。误用SharedPreferences API常常会导致敏感数据暴漏。
参考例子:
SharedPreferences sharedPref = getSharedPreferences("key", MODE_WORLD_READABLE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("username", "administrator");
editor.putString("password", "supersecret");
editor.commit();
一旦代码被执行,key.xml文件将被创建,并存储数据。这段代码违反了几种最佳实践:
- The username and password are stored in clear text in
/data/data/<packagename>/shared_prefs/key.xml.
username和password以明文的形式存储在/data/data//shared_prefs/key.xml.
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="username">administrator</string>
<string name="password">supersecret</string>
</map>
MODE_WORLD_READABLE allows all applications to access and read the contents of
key.xml.
MODE_WORLD_READABLE 允许所有应用去访问和读取 key.xml 的内容。
root@hermes:/data/data/sg.vp.owasp_mobile.myfirstapp/shared_prefs # ls -la-rw-rw-r-- u0_a118 170 2016-04-23 16:51 key.xml
请注意 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在 API 17 已被弃用。尽
管较新的设备可能不受此影响,但使用 Android:targetSdkVersion 值小于 17 编译的应用
程序,如果运行在 Android 4.2 之前发布的操作系统版本上运行,则可能会受到影响。
最佳实践
- 强烈建议使用MODE_PRIVATE。
getSharedPreferences(“filename”,Context.MODE_PRIVATE); - Encrypting Shared Preferences with the AndroidX Security Library
对于敏感数据存储,使用AndroidX 安全库提供的EncryptedSharedPreferences
备注: 仅支持minSdkVersion 23及以上。
使用SharedPreferences存储数据是明文的,当我们存储敏感数据的时候需要进行加密,避免敏感数据泄漏。值得庆幸的是 AndroidX Security library被添加,让min-sdk为23+应用使用SharedPreferences存储加密变得容易和方便。
参考:https://bignerdranch.com/blog/encrypting-shared-preferences-with-the-androidx-security-li