Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android平台中的安全編程]の #00-不要在外部存儲(SD卡)中存放未加密的敏感信息

[Android平台中的安全編程]の #00-不要在外部存儲(SD卡)中存放未加密的敏感信息

編輯:關於Android編程

 

Android提供了幾種保存持久化應用數據的選擇,其中之一就是外部存儲(/sdcard, /mnt/sdcard)。外部存儲包括設備內部的微型或標准大小的SD卡,掛載到PC上的Android設備存儲卡以及Android/obb目錄。

Android4.1之前的版本,存放在外部存儲的文件是world-readable(能夠被任何用戶讀取的)和world-writable(能夠被任何用戶寫入)。從Android4.1到Android4.3,一個app想要寫入外部存儲的任意文件時,只需在AndroidManifest文件中聲明WRITE_EXTERNAL_STORAGE權限。但從Android4.4開始,引入了基於目錄結構創建分組和文件模式,這使得一個app在外部存儲中的只能在以自己包名命名的目錄下才具有文件的讀寫權限。非系統級的app只允許在Android/data//目錄下操作。因此,每個app的文件讀寫權限被獨立開來,不能互相訪問。

上面描述的訪問權限限制的不足,導致寫入到外部存儲的文件可能存在被同一設備上不同的app修改和讀取的風險(Android4.4之前版本)。

Android API指南[Android Guild 2013]關於Storage Options給出了如下的警告信息:如果用戶將外部存儲掛載到PC上或者直接移除了,會導致外部存儲不可用,而且沒有安全措施保證存放在外部存儲上的文件。所有的應用都可以讀寫存放在外部存儲的文件,而且用戶可以隨意刪除它。

開發者不應該在外部存儲中存放未加密的敏感信息,因為外部存儲的文件不能保證可用性,完整性和保密性。

[不符合安全要求的代碼示例]

下面的代碼在外部存儲中創建一個文件,並保存了敏感的信息。

 

private String filename = myfile
 
private String string = sensitive data such as credit card number
FileOutputStream fos = null;
 
try {
  file file = new File(getExternalFilesDir(TARGET_TYPE), filename);
  fos = new FileOutputStream(file, false);
  fos.write(string.getBytes());
} catch (FileNotFoundException e) {
  // handle FileNotFoundException
} catch (IOException e) {
  // handle IOException
} finally {
  if (fos != null) {
    try {
    fos.close();
    } catch (IOException e) {
    }
  }
}

 

[概念驗證]

一個應用一般存放在外部存儲的文件目錄結構如下所示:

 

/sdcard/Android/data/com.company.app/files/save/appdata/save_appdata

 

[符合安全要求的解決方案#1 將文件保存到內部存儲中]

下面的代碼使用openFileOutput()方法在應用的data目錄中創建“myfile”文件,並將訪問權限設置為MODE_PRIVATE,這樣保證其他app訪問不了該文件。

private String filename = myfile
private String string = sensitive data such as credit card number
FileOutputStream fos = null;
 
try {
   fos = openFileOutput(filename, Context.MODE_PRIVATE);
   fos.write(string.getBytes());
   fos.close();
} catch (FileNotFoundException e) {
  // handle FileNotFoundException
} catch (IOException e) {
  // handle IOException
} finally {
  if (fos != null) {
    try {
      fos.close();
    } catch (IOException e) {
    }
  }
}

[符合安全要求的解決方案#2]

在將文件保存到外部存儲之前,先對文件內容進行加密。

 

——歡迎轉載,請注明出處 http://blog.csdn.net/asce1885 ,未經本人同意請勿用於商業用途,謝謝——
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved