威海職業(yè)學(xué)院 梁海麗
Android開發(fā)中的數(shù)據(jù)存儲(chǔ)及其安全性分析
威海職業(yè)學(xué)院 梁海麗
本文首先介紹安卓開發(fā)中三種主要的數(shù)據(jù)存儲(chǔ)方式,給出關(guān)鍵代碼,之后分析了數(shù)據(jù)存儲(chǔ)方式存在的安全隱患,并給出安全建議。
安卓;安全;數(shù)據(jù)存儲(chǔ)
數(shù)據(jù)是程序操作的對(duì)象,所有的應(yīng)用中都會(huì)涉及到數(shù)據(jù)的存儲(chǔ),其安全性也顯得尤為重要。在美國(guó)Verizon公司發(fā)布的《2015年度數(shù)據(jù)泄露調(diào)查報(bào)告》中稱:2015年,全球61個(gè)國(guó)家出現(xiàn)79790起數(shù)據(jù)泄露事件,其中2122起已經(jīng)得到確認(rèn)。數(shù)據(jù)被泄漏到任何非授權(quán)方的事故即為數(shù)據(jù)泄露。這些數(shù)據(jù)泄露事件帶來(lái)的后果是可怕而長(zhǎng)期的。
數(shù)據(jù)安全得到越來(lái)越多關(guān)注,本文從軟件開發(fā)的角度出發(fā),以安卓系統(tǒng)為平臺(tái),從數(shù)據(jù)存儲(chǔ)的角度分析數(shù)據(jù)安全性。在安卓應(yīng)用開發(fā)中,數(shù)據(jù)存儲(chǔ)主要有三種方式,一是使用偏好Shared-Preferences存儲(chǔ);二是使用文件存儲(chǔ);三是使用數(shù)據(jù)庫(kù)存儲(chǔ),下面將詳細(xì)分析每種存儲(chǔ)方式,以及存在的安全隱患,并給出合理的安全建議。
1.1 使用偏好存儲(chǔ)
使用偏好可存儲(chǔ)少量數(shù)據(jù),如應(yīng)用程序的配置信息、程序過(guò)程產(chǎn)生的少量數(shù)據(jù)等,這類數(shù)據(jù)通常格式簡(jiǎn)單,如是否開啟歡迎界面、用戶名或密碼等信息。SharedPreferences存儲(chǔ)的是鍵值對(duì),數(shù)據(jù)存儲(chǔ)底層以xml文件存儲(chǔ),保存在/data/data/<應(yīng)用包名>/shared_prefs目錄之下。存儲(chǔ)的主要代碼如下:
SharedPreferences sp=getSharedPreferences("fileName",Context.MODE_PRIVATE);
Editor ed=mysp.edit();
ed.putInt("age",12);
ed.commit();
1.2 使用文件存儲(chǔ)
1.2.1 內(nèi)部存儲(chǔ)
安卓中的文件存儲(chǔ)類似于Java的文件存儲(chǔ),通過(guò)Java提供的IO流即可實(shí)現(xiàn)數(shù)據(jù)的訪問(wèn),默認(rèn)讀寫的文件都存儲(chǔ)在/data/data/<包名>/files的文件下。存儲(chǔ)的主要代碼如下:
FileOutputStream fos=Context.openFileOutput(“filename”, Context.MODE_PRIVATE);
out.write(content.getBytes("UTF-8"));
out.close();
1.2.2 外部存儲(chǔ)
除了可以將文件存儲(chǔ)在內(nèi)部存儲(chǔ)區(qū)外,還可以將軟件存儲(chǔ)到外部SD卡上,SD卡上可存儲(chǔ)較大的文件,存儲(chǔ)數(shù)據(jù)的主要代碼如下:
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卡時(shí),需要在AndroidManifest.xml中,添加讀寫SD卡的相應(yīng)權(quán)限。
1.3 使用數(shù)據(jù)庫(kù)存儲(chǔ)
SQLite是安卓系統(tǒng)自帶的輕量級(jí)關(guān)系數(shù)據(jù)庫(kù),在應(yīng)用中創(chuàng)建數(shù)據(jù)庫(kù)后,相應(yīng)的數(shù)據(jù)庫(kù)文件是存儲(chǔ)在/data/data/<應(yīng)用包名>/databases/下。
SQLiteOpenHelper是安卓提供的一個(gè)用于創(chuàng)建數(shù)據(jù)庫(kù)的工具類,開發(fā)時(shí)需要繼承該類,通過(guò)該類的getReadableDatabase()或getWritableDatabase()方法獲取用于操作數(shù)據(jù)庫(kù)的SQLiteDatabase實(shí)例,然后通過(guò)該實(shí)例的executeSQL(String sql)方法執(zhí)行SQL語(yǔ)句或通過(guò)insert、delete等方法完成數(shù)據(jù)相應(yīng)操作。
不論何種存儲(chǔ)方式,從存儲(chǔ)位置上分為內(nèi)部存儲(chǔ)和外部存儲(chǔ)兩種方式,除了SD卡存儲(chǔ)外,上述介紹的存儲(chǔ)方式都屬于內(nèi)部存儲(chǔ)。SD卡是一個(gè)公共的存儲(chǔ)空間,沒有讀寫權(quán)限的管理,安卓應(yīng)用只需要聲明 READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE權(quán)限,即可隨意創(chuàng)建、修改位于外部存儲(chǔ)中的任何文件。因此,在實(shí)際開發(fā)中,重要的數(shù)據(jù)應(yīng)使用內(nèi)部存儲(chǔ)。
利用偏好和文件進(jìn)行內(nèi)部存儲(chǔ)時(shí),打開文件的方式有三種,除了上面代碼中的私有模式外,還有如下兩種:
Context.MODE_WORLD_READABLE;全局讀,數(shù)據(jù)可被所有應(yīng)用讀;
Context.MODE_WORLD_WRITEABLE);全局寫,數(shù)據(jù)可被所有應(yīng)用讀、寫。
顯然,如果將文件模式設(shè)為全局讀或全局寫,存在著數(shù)據(jù)泄露的危險(xiǎn),是極不安全的,這兩種模式在sdk4.2中已經(jīng)被廢除了。其次,即使設(shè)為私有模式,數(shù)據(jù)也不是絕對(duì)安全的,攻擊者通過(guò)獲得root權(quán)限同樣可以獲取到存儲(chǔ)的數(shù)據(jù)。因此,即使采用內(nèi)部存儲(chǔ),對(duì)于重要、敏感數(shù)據(jù),如密碼、聊天記錄等,也要避免明文存儲(chǔ),一定要加密后再存儲(chǔ),可以從一定程度上確保數(shù)據(jù)的安全性。
在實(shí)際開發(fā)中,除了本文提到的數(shù)據(jù)存儲(chǔ)安全外,還有很多影響安全的因素,比如清單文件中不必要的權(quán)限,通過(guò)網(wǎng)絡(luò)明文傳輸敏感信息等。作為軟件開發(fā)人員,要充分認(rèn)識(shí)到安全開發(fā)的重要性,并在實(shí)際開發(fā)中采取有效措施,保證軟件的安全性。
[1]張?jiān)?Android開發(fā)應(yīng)用實(shí)戰(zhàn)詳解[M].中國(guó)鐵道出版社, 2011.