- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- Android中是如何實(shí)現數據存儲安全的
Android中是如何實(shí)現數據存儲安全的,相信很多沒(méi)有經(jīng)驗的人對此束手無(wú)策,為此本文總結了問(wèn)題出現的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
存儲數據最直接的方法就是以文件的形式保存在手機中,Android開(kāi)發(fā)主要基于Java語(yǔ)言,因此,在文件讀寫(xiě)等基本操作相同,文件操作和數據流來(lái)源于java.IO.*,但是對于A(yíng)ndroid而言,開(kāi)發(fā)者需要注意一下幾點(diǎn):
1、文件目錄 Android權限管理中各個(gè)應用程序有獨立的存儲空間,存儲結構如下:
2、常見(jiàn)文件目錄及路徑
/data/data/(packageName)/cache目錄 應用緩存文件,目錄獲取方法:File cache = getCacheDir()
/data/data/(packageName)/files目錄,即應用一般文件,目錄獲取方法:File file = getFilesDir()
/data/data/(packageName)/shared_prefs目錄,存放應用SharedPreference文件目錄位置
/data/data/(packageName)/databases目錄,應用數據庫目錄(SQLite)
/storage/emulated/0/sdcard內置sd卡目錄,獲取方法:String sdcard = getInnerSDCardPath()
/storage/extSdCard外置sd卡目錄,獲取方法:String exsdcard = Environment.getExternalStorageDirectory().getPath()
在A(yíng)ndroid手機中,獲取默認sd卡目錄方法明確,但是由于A(yíng)ndroid手機本身不一定支持外置sd卡,或者有/沒(méi)有插入外置sd卡,因此在獲取外sd卡時(shí)需要留心有坑,一是避免異常,二是分清內置和外置。
關(guān)鍵:位置。通過(guò)文件保存用戶(hù)或者應用數據時(shí),首先要遵循Android開(kāi)發(fā)的規則,在應用目錄中根據文件的類(lèi)型選擇保存的外置。在sd卡中存放時(shí),避免直接保存在根目錄下,這樣做是避免造成用戶(hù)手機文件管理的混亂;二是避免文件被修改、刪除等。
Android 數據庫采用SQLite,SQLite 是一款內置到移動(dòng)設備上的輕量型的數據庫,是遵守ACID(原子性、一致性、隔離性、持久性)的關(guān)聯(lián)式數據庫管理系統。Android開(kāi)發(fā)中可以通過(guò)SQLiteOpenHelper或者自定義類(lèi)SQLiteOpenHelper來(lái)實(shí)現數據存儲查詢(xún)修改的功能。此外SQLite數據庫支持加密操作,通過(guò)sqlite3.exe或者SQLiteConnection均可對數據庫進(jìn)行加密操作。SQLiteEncrypt、SQLiteCrypt、SQLCipher等工具提供對數據庫的加密操作,但是前兩個(gè)需要收費,SQLCipher是開(kāi)源工具,GitHub地址為: SQLCipher;通過(guò)SQLiteConnection類(lèi)加密方法如下:
SQLiteConnection conn = new SQLiteConnection("Data Source=TestDatabase.sqlite;Version=3;"); conn.SetPassword("password"); conn.open();
SharedPreferences存儲方式是Android中存儲輕量級數據的一種方式,內部以Map方式進(jìn)行存儲,保存的數據以xml格式存放在本地的/data/data/(packagename)/shared_prefs文件夾下。SharedPreference<key,value>value支持Java的基本操作類(lèi)型,如Boolean、Int,Float等,文件輕量級數據要求保存數據value大小不能太大,數據太大會(huì )給系統GC、內存帶來(lái)壓力,甚至造成Activity程序卡頓。
SharedPreferences pref = getSharedPreferences("test", MODE_PRIVATE); SharedPreferences.Editor editor=pref.edit(); SharedPreferences.Editor editor=pref.edit();editor.putString("name", "root");//保存字符串 editor.putInt("age", 12);//保存整型數據 editor.commit(); //putXXX 方法中第一個(gè)參數是key,第二參數為value
SharedPreferences pref = getSharedPreferences(“setting”, 0); pref.getInt("key_name", -1); // getting Integer pref.getFloat("key_name", null); // getting Float pref.getLong("key_name", null); // getting Long //getXXX方法第一個(gè)參數表示key名稱(chēng),第二個(gè)表示value默認值
DES,對稱(chēng)加密,同理有3DES,3DES在DES的基礎上進(jìn)行3重加密,以犧牲效率來(lái)提高加密安全性。
//DES加密[] encrypt([] data,String key){ { [] bkey = key.getBytes(); // 初始化向量IvParameterSpec iv = IvParameterSpec(bkey); DESKeySpec desKey = DESKeySpec(bkey); // 創(chuàng )建密匙工廠(chǎng),把DESKeySpec轉換成securekey SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(); SecretKey securekey = keyFactory.generateSecret(desKey); Cipher cipher = Cipher.getInstance(); // 用密匙初始化Cipher對象cipher.init(Cipher., securekey, iv); // 現在,獲取數據并加密 // 加密操作cipher.doFinal(data); } (Throwable e) { e.printStackTrace(); } ; }
//DES解密[] decrypt([] src, String key) Exception { [] bkey = key.getBytes(); // 初始化向量IvParameterSpec iv = IvParameterSpec(bkey); // 創(chuàng )建一個(gè)DESKeySpec對象DESKeySpec desKey = DESKeySpec(bkey); // 創(chuàng )建密匙工廠(chǎng)SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(); // 把DESKeySpec對象轉換成SecretKey對象SecretKey securekey = keyFactory.generateSecret(desKey); // Cipher對象實(shí)際完成解密操作Cipher cipher = Cipher.getInstance(); // 用密匙初始化Cipher對象cipher.init(Cipher., securekey, iv); // 真正開(kāi)始解密操作cipher.doFinal(src); }
AES 高級加密標準,用來(lái)替代DES的對稱(chēng)加密算法
//AES 加密[] encrypt([] data, [] key) { { KeyGenerator kgen = KeyGenerator.getInstance();// 創(chuàng )建AES的Key生產(chǎn)者kgen.init(128, SecureRandom(key));// 128位的key生產(chǎn)者SecretKey secretKey = kgen.generateKey();// 根據key生成密鑰[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰SecretKeySpec aesKey = SecretKeySpec(enCodeFormat, );// 轉換為AES密鑰Cipher cipher = Cipher.getInstance();// 創(chuàng )建密碼器cipher.init(Cipher., aesKey);// 初始化為加密模式的密碼器 // 加密cipher.doFinal(data); }(NoSuchAlgorithmException e){ e.printStackTrace(); } (NoSuchPaddingException e) { e.printStackTrace(); }(InvalidKeyException e) { e.printStackTrace(); } (IllegalBlockSizeException e) { e.printStackTrace(); } (BadPaddingException e) { e.printStackTrace(); } ; }//AES 解密[] decrypt([] data, [] key) { { KeyGenerator kgen = KeyGenerator.getInstance();// 創(chuàng )建AES的Key生產(chǎn)者kgen.init(128, SecureRandom(key)); SecretKey secretKey = kgen.generateKey();// 根據用戶(hù)密碼,生成一個(gè)密鑰[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰SecretKeySpec aesKey = SecretKeySpec(enCodeFormat, );// 轉換為AES專(zhuān)用密鑰Cipher cipher = Cipher.getInstance();// 創(chuàng )建密碼器cipher.init(Cipher., aesKey);// 初始化為解密模式的密碼器 //解密cipher.doFinal(data); } (NoSuchAlgorithmException e) { e.printStackTrace(); } (NoSuchPaddingException e) { e.printStackTrace(); } (InvalidKeyException e) { e.printStackTrace(); } (IllegalBlockSizeException e) { e.printStackTrace(); } (BadPaddingException e) { e.printStackTrace(); } ; }
對稱(chēng)加密特點(diǎn)是實(shí)現效率快,但是由于加/解密密鑰相同,在密鑰保存、分發(fā)、安全各方面出現許多問(wèn)題,例如密鑰管理,密鑰泄露?;诖?,將加密密鑰和解密密鑰分開(kāi),形成客戶(hù)端端使用公鑰加密,服務(wù)端用私鑰解密的非對稱(chēng)加密,將加解密密鑰分開(kāi),加密密鑰不必擔心泄露風(fēng)險。常用的非對稱(chēng)加密算法如RSA。
RSA加解密實(shí)現
// 生成 public and private keysKeyPair buildKeyPair() NoSuchAlgorithmException { keySize = 2048; KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(); keyPairGenerator.initialize(keySize); keyPairGenerator.genKeyPair(); } //RSA 加密 [] encrypt(PrivateKey privateKey, [] data) Exception { Cipher cipher = Cipher.getInstance(); cipher.init(Cipher., privateKey); //加密cipher.doFinal(data); } //RSA 解密 [] decrypt(PublicKey publicKey, [] enData) Exception { Cipher cipher = Cipher.getInstance(); cipher.init(Cipher., publicKey); //解密cipher.doFinal(enData); }
在常用數據加密方法中,通常也會(huì )遇到md5、sha-256算法等,但是這些算法是明文的hash值,哈希算法和加密算法的本質(zhì)是是否可逆,即由密文通過(guò)運算得到明文。特別注意,base64編碼是一種編碼格式,除了增加可讀性難度沒(méi)有任何安全性。
在上文中介紹了常用的Android數據存儲方式和加密算法,通過(guò)直觀(guān)的介紹進(jìn)入到Android存儲安全中,在實(shí)際的應用中數據存儲安全性問(wèn)題是一個(gè)復制的系統性問(wèn)題,不僅僅表現在開(kāi)發(fā)中,從數據結構到編碼以及密鑰的生成和管理都會(huì )涉及到數據存儲安全。
文件的隱藏 Android創(chuàng )建隱藏文件或者文件夾,在文件名或者文件夾名字前加一個(gè)“.”號即可(這里是英文輸入法下的.號),隱藏文件/文件夾可直接進(jìn)行讀寫(xiě)。這是一個(gè)容易被開(kāi)發(fā)者忽略的問(wèn)題,乍一看好像沒(méi)什么難度,問(wèn)題在于開(kāi)發(fā)者和用戶(hù)視角問(wèn)題。由于A(yíng)ndroid手機默認帶文件查看器,因此用戶(hù)可以輕松查看、修改sdcard目錄下的文件,當使用隱藏文件是最大的作用是避免用戶(hù)誤操作。
密鑰的保存 如果將密鑰保存到手機文件中,或者通過(guò)硬編碼的方式寫(xiě)在代碼中,容易被逆向出來(lái),在通常情況下,采用對稱(chēng)加密密鑰需要保存在用戶(hù)手機中,這和安全性想違背。通常最好的方式是不要保有密鑰,通過(guò)固定數據或者字符串做加密密鑰因子,例如用戶(hù)唯一賬號屬性等。
編碼方式 Android代碼主要有Java編碼,打包文件時(shí)Java代碼打包成dex文件防到安裝包文件中,但是dex文件容易被逆向回smali代碼或者Java文件。雖然目前混淆和加殼甚至是虛擬機保護(VMP)技術(shù)已經(jīng)很成熟,簡(jiǎn)單逆向工作無(wú)法獲取代碼邏輯和硬編碼字符串,但是Java代碼依然存在很高的安全風(fēng)險。因此,將加解密相關(guān)操作通過(guò)Native代碼實(shí)現很有必要,不僅保證效率而且在so保護技術(shù)之上安全性更高。
隨著(zhù)移動(dòng)互聯(lián)網(wǎng)深入發(fā)展,目前移動(dòng)應用正在發(fā)生質(zhì)的改變。相比繁榮初始的粗狂、野蠻,現在的移動(dòng)應用開(kāi)始考慮安全和質(zhì)量,特別是當前我國互聯(lián)網(wǎng)信息安全的大形勢,數據安全關(guān)乎企業(yè)和應用的生存的前提,保護應用數據安全至關(guān)重要。在A(yíng)ndroid數據存儲安全中,由于A(yíng)ndroid系統的安全機制,用戶(hù)獲取root權限后可以訪(fǎng)問(wèn)手機所有目錄,包括應用私有目錄,因此,數據存儲要考慮到一個(gè)白盒環(huán)境,或者非可信環(huán)境。這種情況下,數據加密的密鑰成為關(guān)鍵。一機一密、動(dòng)態(tài)密鑰、密鑰白盒等手段各有優(yōu)缺點(diǎn)。一機一密需要保護密鑰生成方法邏輯;動(dòng)態(tài)密鑰需要考慮密鑰時(shí)效性,有效性以及鏈路安全;密鑰白盒由于目前沒(méi)有廣泛認可,在兼容性安全性方面有待考驗。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站