浅析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):其中的typeEnvironment下的一些字符常量,如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用户,以获得最高权限,读写任意资源。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值