中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中是如何實現數據存儲安全的

發布時間:2021-06-28 15:01:13 來源:億速云 閱讀:231 作者:Leah 欄目:數據安全

Android中是如何實現數據存儲安全的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

0x01常用數據存儲方法及實例 

文件 

存儲數據最直接的方法就是以文件的形式保存在手機中,Android開發主要基于Java語言,因此,在文件讀寫等基本操作相同,文件操作和數據流來源于java.IO.*,但是對于Android而言,開發者需要注意一下幾點:

1、文件目錄 Android權限管理中各個應用程序有獨立的存儲空間,存儲結構如下:

Android中是如何實現數據存儲安全的

2、常見文件目錄及路徑

/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()

在Android手機中,獲取默認sd卡目錄方法明確,但是由于Android手機本身不一定支持外置sd卡,或者有/沒有插入外置sd卡,因此在獲取外sd卡時需要留心有坑,一是避免異常,二是分清內置和外置。

關鍵:位置。通過文件保存用戶或者應用數據時,首先要遵循Android開發的規則,在應用目錄中根據文件的類型選擇保存的外置。在sd卡中存放時,避免直接保存在根目錄下,這樣做是避免造成用戶手機文件管理的混亂;二是避免文件被修改、刪除等。

數據庫

Android 數據庫采用SQLite,SQLite 是一款內置到移動設備上的輕量型的數據庫,是遵守ACID(原子性、一致性、隔離性、持久性)的關聯式數據庫管理系統。Android開發中可以通過SQLiteOpenHelper或者自定義類SQLiteOpenHelper來實現數據存儲查詢修改的功能。此外SQLite數據庫支持加密操作,通過sqlite3.exe或者SQLiteConnection均可對數據庫進行加密操作。SQLiteEncrypt、SQLiteCrypt、SQLCipher等工具提供對數據庫的加密操作,但是前兩個需要收費,SQLCipher是開源工具,GitHub地址為: SQLCipher;通過SQLiteConnection類加密方法如下:

SQLiteConnection conn = new SQLiteConnection("Data Source=TestDatabase.sqlite;Version=3;"); conn.SetPassword("password"); conn.open();

SharedPreferences存儲

SharedPreferences存儲方式是Android中存儲輕量級數據的一種方式,內部以Map方式進行存儲,保存的數據以xml格式存放在本地的/data/data/(packagename)/shared_prefs文件夾下。SharedPreference<key,value>value支持Java的基本操作類型,如Boolean、Int,Float等,文件輕量級數據要求保存數據value大小不能太大,數據太大會給系統GC、內存帶來壓力,甚至造成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 方法中第一個參數是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方法第一個參數表示key名稱,第二個表示value默認值

0x02 Android加密算法及實現

DES,對稱加密,同理有3DES,3DES在DES的基礎上進行3重加密,以犧牲效率來提高加密安全性。

//DES加密[] encrypt([] data,String key){
     {
         [] bkey = key.getBytes();
         // 初始化向量IvParameterSpec iv = IvParameterSpec(bkey);
         DESKeySpec desKey = DESKeySpec(bkey);
         // 創建密匙工廠,把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);
     // 創建一個DESKeySpec對象DESKeySpec desKey = DESKeySpec(bkey);
     // 創建密匙工廠SecretKeyFactory keyFactory = SecretKeyFactory.getInstance();
     // 把DESKeySpec對象轉換成SecretKey對象SecretKey securekey = keyFactory.generateSecret(desKey);
     // Cipher對象實際完成解密操作Cipher cipher = Cipher.getInstance();
     // 用密匙初始化Cipher對象cipher.init(Cipher., securekey, iv);
     // 真正開始解密操作cipher.doFinal(src);
 }

AES 高級加密標準,用來替代DES的對稱加密算法 

//AES 加密[] encrypt([] data, [] key) {
     {
         KeyGenerator kgen = KeyGenerator.getInstance();// 創建AES的Key生產者kgen.init(128, SecureRandom(key));// 128位的key生產者SecretKey secretKey = kgen.generateKey();// 根據key生成密鑰[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰SecretKeySpec aesKey = SecretKeySpec(enCodeFormat, );// 轉換為AES密鑰Cipher cipher = Cipher.getInstance();// 創建密碼器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();// 創建AES的Key生產者kgen.init(128, SecureRandom(key));
         SecretKey secretKey = kgen.generateKey();// 根據用戶密碼,生成一個密鑰[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰SecretKeySpec aesKey = SecretKeySpec(enCodeFormat, );// 轉換為AES專用密鑰Cipher cipher = Cipher.getInstance();// 創建密碼器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();
     }
     ;
 }

對稱加密特點是實現效率快,但是由于加/解密密鑰相同,在密鑰保存、分發、安全各方面出現許多問題,例如密鑰管理,密鑰泄露。基于此,將加密密鑰和解密密鑰分開,形成客戶端端使用公鑰加密,服務端用私鑰解密的非對稱加密,將加解密密鑰分開,加密密鑰不必擔心泄露風險。常用的非對稱加密算法如RSA。

RSA加解密實現

// 生成 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);
 }

在常用數據加密方法中,通常也會遇到md5、sha-256算法等,但是這些算法是明文的hash值,哈希算法和加密算法的本質是是否可逆,即由密文通過運算得到明文。特別注意,base64編碼是一種編碼格式,除了增加可讀性難度沒有任何安全性。 

0x03 存儲安全進階

在上文中介紹了常用的Android數據存儲方式和加密算法,通過直觀的介紹進入到Android存儲安全中,在實際的應用中數據存儲安全性問題是一個復制的系統性問題,不僅僅表現在開發中,從數據結構到編碼以及密鑰的生成和管理都會涉及到數據存儲安全。

文件的隱藏 Android創建隱藏文件或者文件夾,在文件名或者文件夾名字前加一個“.”號即可(這里是英文輸入法下的.號),隱藏文件/文件夾可直接進行讀寫。這是一個容易被開發者忽略的問題,乍一看好像沒什么難度,問題在于開發者和用戶視角問題。由于Android手機默認帶文件查看器,因此用戶可以輕松查看、修改sdcard目錄下的文件,當使用隱藏文件是最大的作用是避免用戶誤操作。

密鑰的保存 如果將密鑰保存到手機文件中,或者通過硬編碼的方式寫在代碼中,容易被逆向出來,在通常情況下,采用對稱加密密鑰需要保存在用戶手機中,這和安全性想違背。通常最好的方式是不要保有密鑰,通過固定數據或者字符串做加密密鑰因子,例如用戶唯一賬號屬性等。

編碼方式 Android代碼主要有Java編碼,打包文件時Java代碼打包成dex文件防到安裝包文件中,但是dex文件容易被逆向回smali代碼或者Java文件。雖然目前混淆和加殼甚至是虛擬機保護(VMP)技術已經很成熟,簡單逆向工作無法獲取代碼邏輯和硬編碼字符串,但是Java代碼依然存在很高的安全風險。因此,將加解密相關操作通過Native代碼實現很有必要,不僅保證效率而且在so保護技術之上安全性更高。

0x04 Android數據安全思考

隨著移動互聯網深入發展,目前移動應用正在發生質的改變。相比繁榮初始的粗狂、野蠻,現在的移動應用開始考慮安全和質量,特別是當前我國互聯網信息安全的大形勢,數據安全關乎企業和應用的生存的前提,保護應用數據安全至關重要。在Android數據存儲安全中,由于Android系統的安全機制,用戶獲取root權限后可以訪問手機所有目錄,包括應用私有目錄,因此,數據存儲要考慮到一個白盒環境,或者非可信環境。這種情況下,數據加密的密鑰成為關鍵。一機一密、動態密鑰、密鑰白盒等手段各有優缺點。一機一密需要保護密鑰生成方法邏輯;動態密鑰需要考慮密鑰時效性,有效性以及鏈路安全;密鑰白盒由于目前沒有廣泛認可,在兼容性安全性方面有待考驗。 

看完上述內容,你們掌握Android中是如何實現數據存儲安全的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

饶平县| 沙湾县| 中牟县| 涿鹿县| 定远县| 桃园县| 沿河| 轮台县| 曲松县| 甘泉县| 镇远县| 定州市| 新和县| 金山区| 和硕县| 承德市| 鲁山县| 南丹县| 泸定县| 故城县| 二连浩特市| 榆中县| 和田县| 黄大仙区| 油尖旺区| 逊克县| 宿迁市| 海阳市| 枝江市| 邹城市| 子长县| 桂阳县| 九寨沟县| 宾阳县| 时尚| 年辖:市辖区| 固安县| 鄯善县| 光泽县| 闽侯县| 德格县|