浅析Android 程序数据存储及安全性
1.概述
程序安装后会默认生成许多文件夹,这些文件夹有其特定的用处,总的说来有两类
1.内部存储,是受保护,私有的,只有本程序才能访问的,文件位置在data/data/package name/下。
2.外部存储,没有安全机制的,公开的,可分享的,文件位置在/Android/data/package name/下。
2.操作
1.内部存储的具体位置是:data/data/package name/。在Context类中有多个方法可以对内存存储进行直接操作,主要是打开该文件下的一些子目录。他们有一些共性是只允许本程序访问,在程序卸载时移除。
A.getSharedPreferences:这个大家很熟悉了,就是共享偏好设置,他以键值对的形式保持在xml文件中,其位置是data/data/package name/shared_prefs/
B.openFileInput(String name)/openFileOutput(String name, int mode):name是文件名,mode是写入数据的模式。该方法返回直接返回数据流。其位置是data/data/package name/files/name
MODEL_PRIVATE:创建的数据是私有类型。
MODEL_APPEND:在原来数据的末尾添加数据
MODE_WORLD_READABLE/MODE_WORLD_WRITEABLE:这两个在4.2已经被废除了。他的意思是创建其他程序可读写的文件。这废除的好,在内部又允许其他程序访问,真是不伦不类。
C.getCacheDir():返回该程序缓存目录文件。其位置data/data/package name/cache/。要注意的是在内部存储空间比较小时系统会自动回收这块空间,所以不要在这里缓存大数据以及不可恢复的数据。并且在系统设置中application manger栏中有个clear cache的按钮就是清除该文件夹的。
D.deleteFile(String name):删除data/data/package name/files/name这个文件。E.getFilesDir():返回data/data/package name/cache/files这个文件目录。
F.getDir(String name, int mode):该方法会创建或返回一个文件目录。并会在name前自动加上app_这个前缀。其位置是data/data/package name/app_name/,android只允许你通过这个方法在内部存储中创建目录。
G.sqlite数据库:其位置在data/data/package name/database/。
2.外部存储的位置是/Android/data/package name/或/storage/sdcard0/Android/data/package name/,注意这是同一个位置,只是打开的路径不同,因为linux中允许创建不同的连接。他们也有一些共性:需要外部读写权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
都是可以分享的公有数据,程序卸载时会被移除。注意若果你开发的版本是API 7或以下的可以使用Environment类来解决兼容问题。
A.getExternalFilesDir(String type):其中的type是Environment下的一些字符常量,如DIRECTORY_MUSIC、DIRECTORY_NOTIFICATIONS等,也就是文件名,若为null则返回根目录(/Android/data/package name/files/)。
B.getExternalCacheDir():打开的目录是/Android/data/<package_name>/cache/。
C.若你想永久的存储一些数据,android文件系统中有一些文件夹如Music、Download等,这些文件的操作在Environment类中,也可以模仿QQ、雅虎天气那样在Environment.getExternalStorageDirectory()也就是/storage/sdcard0/下创建一个和程序相关的目录,系统不会自动管理该目录。当然这样的做法是极其不道德的,程序已经卸载却保留着大堆无用数据占据着用户存储空间,并且残留的数据也带来了隐私安全问题。所以并不建议开发者这样做。
3.数据安全:
a.内部存储的原理是沙箱机制,沙箱的实现是Dalvik虚拟机和linux文件访问控制。沙箱将不同程序彼此隔离,并阻止程序之间共享资源。每个程序都有一个系统分配的唯一uid,这个id便是访问沙箱的身份证明,uid由系统在程序安装时分配(可以通过android.os.Process.myUid()得到)。建议和用户有关的数据都要存到私有数据下,在外部存储中,所有的程序都能访问到,存在了非常大的隐私安全隐患。而在私有数据下,程序不主动公布自己的资源其他程序是无法访问到的。
b.android中还有一种程序安装在外部存储的情况(android:installLocation="preferExternal")
,程序安装在外部时,其私有数据仍然存储在内部存储中,所以不必担心这种情况下的安全问题。
c.预防媒体应用扫描:在文件中加一个名为.nomedia的的空文件,可以预防媒体应用扫描(如图库中不会出现这个文件夹中的图片)。
d.如果解决方案中需要考虑到手机丢失而造成的隐私泄露,可以使用android设备管理策略,该技术能实现远程操作手机,并能擦除数据或恢复出厂设置。具体实现可以参考我的这篇博客
http://blog.csdn.net/flypu/article/details/21517337
4.共享内部资源
1.Content-Provider:四大组件之一,这个不需多讲了。
2.sharedUserId:在manifest设置两个程序的android:sharedUserId值相同,通过createPackageContext("orther package name",Context.CONTEXT_IGNORE_SECURITY)得到另一个程序的上下文,由此便可以实现程序间私有数据访问了。不过这个实现有点麻烦。
3.File Model:就是openFileOutput(String name, int mode),这个在4.2之前是有效的。
4.root权限:root的原理是执行su用户,以获得最高权限,读写任意资源。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。