威海职业学院 梁海丽
Android开发中的数据存储及其安全性分析
威海职业学院 梁海丽
本文首先介绍安卓开发中三种主要的数据存储方式,给出关键代码,之后分析了数据存储方式存在的安全隐患,并给出安全建议。
安卓;安全;数据存储
数据是程序操作的对象,所有的应用中都会涉及到数据的存储,其安全性也显得尤为重要。在美国Verizon公司发布的《2015年度数据泄露调查报告》中称:2015年,全球61个国家出现79790起数据泄露事件,其中2122起已经得到确认。数据被泄漏到任何非授权方的事故即为数据泄露。这些数据泄露事件带来的后果是可怕而长期的。
数据安全得到越来越多关注,本文从软件开发的角度出发,以安卓系统为平台,从数据存储的角度分析数据安全性。在安卓应用开发中,数据存储主要有三种方式,一是使用偏好Shared-Preferences存储;二是使用文件存储;三是使用数据库存储,下面将详细分析每种存储方式,以及存在的安全隐患,并给出合理的安全建议。
1.1 使用偏好存储
使用偏好可存储少量数据,如应用程序的配置信息、程序过程产生的少量数据等,这类数据通常格式简单,如是否开启欢迎界面、用户名或密码等信息。SharedPreferences存储的是键值对,数据存储底层以xml文件存储,保存在/data/data/<应用包名>/shared_prefs目录之下。存储的主要代码如下:
SharedPreferences sp=getSharedPreferences("fileName",Context.MODE_PRIVATE);
Editor ed=mysp.edit();
ed.putInt("age",12);
ed.commit();
1.2 使用文件存储
1.2.1 内部存储
安卓中的文件存储类似于Java的文件存储,通过Java提供的IO流即可实现数据的访问,默认读写的文件都存储在/data/data/<包名>/files的文件下。存储的主要代码如下:
FileOutputStream fos=Context.openFileOutput(“filename”, Context.MODE_PRIVATE);
out.write(content.getBytes("UTF-8"));
out.close();
1.2.2 外部存储
除了可以将文件存储在内部存储区外,还可以将软件存储到外部SD卡上,SD卡上可存储较大的文件,存储数据的主要代码如下:
if(Environment.getExternalStorageState().equals(Environment. MEDIA_MOUNTED)){
File path=Environment.getExternalStorageDirectory();
FileOutputStream fo=new FileOutputStream(path.getCanonical-Path()+“filename”);
fo.write(content);
fo.close();}
读写SD卡时,需要在AndroidManifest.xml中,添加读写SD卡的相应权限。
1.3 使用数据库存储
SQLite是安卓系统自带的轻量级关系数据库,在应用中创建数据库后,相应的数据库文件是存储在/data/data/<应用包名>/databases/下。
SQLiteOpenHelper是安卓提供的一个用于创建数据库的工具类,开发时需要继承该类,通过该类的getReadableDatabase()或getWritableDatabase()方法获取用于操作数据库的SQLiteDatabase实例,然后通过该实例的executeSQL(String sql)方法执行SQL语句或通过insert、delete等方法完成数据相应操作。
不论何种存储方式,从存储位置上分为内部存储和外部存储两种方式,除了SD卡存储外,上述介绍的存储方式都属于内部存储。SD卡是一个公共的存储空间,没有读写权限的管理,安卓应用只需要声明 READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限,即可随意创建、修改位于外部存储中的任何文件。因此,在实际开发中,重要的数据应使用内部存储。
利用偏好和文件进行内部存储时,打开文件的方式有三种,除了上面代码中的私有模式外,还有如下两种:
Context.MODE_WORLD_READABLE;全局读,数据可被所有应用读;
Context.MODE_WORLD_WRITEABLE);全局写,数据可被所有应用读、写。
显然,如果将文件模式设为全局读或全局写,存在着数据泄露的危险,是极不安全的,这两种模式在sdk4.2中已经被废除了。其次,即使设为私有模式,数据也不是绝对安全的,攻击者通过获得root权限同样可以获取到存储的数据。因此,即使采用内部存储,对于重要、敏感数据,如密码、聊天记录等,也要避免明文存储,一定要加密后再存储,可以从一定程度上确保数据的安全性。
在实际开发中,除了本文提到的数据存储安全外,还有很多影响安全的因素,比如清单文件中不必要的权限,通过网络明文传输敏感信息等。作为软件开发人员,要充分认识到安全开发的重要性,并在实际开发中采取有效措施,保证软件的安全性。
[1]张元亮.Android开发应用实战详解[M].中国铁道出版社, 2011.