【Android平台中的安全编程】の #00-不要在外部存储(SD卡)中存放未加密的敏感信息

本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD00-J.+Do+not+store+sensitive+information+on+external+storage+%28SD+card%29+unless+encrypted+first,有增删改。

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/<package-name>/目录下操作。因此,每个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 ,未经本人同意请勿用于商业用途,谢谢——

【Android平台中的安全编程】の #00-不要在外部存储(SD卡)中存放未加密的敏感信息

时间: 2024-11-10 14:15:47

【Android平台中的安全编程】の #00-不要在外部存储(SD卡)中存放未加密的敏感信息的相关文章

【Android平台安全方案】の #00-请不要在外部存储(SD卡)加密存储的敏感信息

本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD00-J.+Do+not+store+sensitive+information+on+external+storage+%28SD+card%29+unless+encrypted+first,有增删改. Android提供了几种保存持久化应用数据的选择,当中之中的一个就是外部存储(/sdcard, /mnt/sdcard).外部存储包含设备内部的微型或标准大小的

Android——数据存储:手机外部存储 SD卡存储

xml <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_5" android:hint="要存储的的内容"/> <EditText android:layout_width="match_parent" android:layout_

过滤android应用列表(区分系统应用、第三方应用、sd卡中的应用)

if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { // 系统程序 }else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) { //非系统程序 }else if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){ //被用户更新过的系统应用 }else if ((app.flags &

Android -- 写xml到SD卡中

信息类                                                                                          private String body; private String number; private int type; private long id; 四个变量,然后有分别set和get.构造函数分别初始化这四个变量. 生成xml标签函数                                   

android 往sd卡中写入文件

在调用前需要判断是否有写入权限 Environment类提供了比较丰富的方法 static File getDataDirectory() 获得android data的目录. static File getDownloadCacheDirectory() 获得下载缓存目录. static File getExternalStorageDirectory() 或者外部存储媒体目录. static File getExternalStoragePublicDirectory(String type

Android中使用SQLiteOpenHelper管理SD卡中的数据库

使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databases中(可使用Eclispe的DDMS查看). (2)如果无法获取Root权限,则无法直接查看创建的数据库. 鉴于上述限制及实际需要,打算使用SQLiteOpenHelper管理SD卡上的数据库,通过研究SQLiteOpenHelper的源码,发现其创建或打开数据库的代码位于getWritableD

android中使用Http下载文件并保存到本地SD卡

---恢复内容开始--- 1.AndroidMainfest.xml中设置权限 1 <uses-permission android:name="android.permission.INTERNET"></uses-permission> 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission

android 读取sd卡中的图片

一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限  -->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>    <!-- 往SDCard写入数据权限 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STO

Android 手持PDA读取SD卡中文件

近两年市场上很多Wince设备都开始转向Android操作系统,最近被迫使用Android开发PDA手持设备.主要功能是扫描登录,拣货,包装,发货几个功能.其中涉及到商品档的时候大概有700左右商品要导入到Android设备中,因为现场操作环境没有WiFi ,所以商品档不能直接访问服务,将商品档记录到txt文件中. 一. 将txt文件存放到SD开中 将商品档编辑成为txt文件然后拷贝到SD卡中,当然也可以存储其他的数据格式,甚至可以使用Sqlite来存储,这里没有这个必要所以就直接使用txt 二