本文翻译自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卡)加密存储的敏感信息的更多相关文章

  1. Android相机、相册获取图片显示并保存到SD卡

    Android相机.相册获取图片显示并保存到SD卡 [复制链接]   电梯直达 楼主    发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图  本帖最后由 happy小妖同学 ...

  2. Android全屏截图的方法,返回Bitmap并且保存在SD卡上

    Android全屏截图的方法,返回Bitmap并且保存在SD卡上 今天做分享,需求是截图分享,做了也是一个运动类的产品,那好,我们就直接开始做,考虑了一下,因为是全屏的分享,所有很自然而然的想到了Vi ...

  3. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  4. android 数据存储&lt;一&gt;----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局.线性布局,绝对布局.表格布局.标签布局等,各个布局能够嵌套的. 本文的布局文件就是线性布局的嵌套 <LinearLayout ...

  5. Android之外部存储(SD卡)

    *手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...

  6. android 数据存储----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...

  7. android:http下载文件并保存到本地或SD卡

    想把文件保存到SD卡中,一定要知道SD卡的路径,获取SD卡路径: Environment.getExternalStorageDirectory() 另外,在保存之前要判断SD卡是否已经安装好,并且可 ...

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

    1.AndroidMainfest.xml中设置权限 <uses-permission android:name="android.permission.INTERNET"& ...

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

    xml <EditText android:layout_width="match_parent" android:layout_height="wrap_cont ...

随机推荐

  1. Centos安装后,没有ifconfig工具

    yum install net-tools yum不能用时,就下载rpm来安装 hostname -f, --fqdn, --long Display the FQDN (Fully Qualifie ...

  2. Cocos2d-Java安装和配置跨平台游戏引擎以及相关的开发工具

    假设认为博文图片不清晰.能够Ctrl+鼠标滚动缩放网页比例 Cocos2d-Java是什么? http://blog.csdn.net/touchsnow/article/details/387047 ...

  3. GoldenGate组态(四)它veridata组态

    GoldenGate组态(四)它veridata组态 环境: Item Source System Target System Platform Red Hat Enterprise Linux Se ...

  4. MKMapView移动事件地图

    MKMapView移动事件地图 by 吴雪莹 -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated { ...

  5. SSH深度历险(三) EJB Session Bean有状态和无状态的差别与联系

    刚開始对两种sessionbean存在误解.觉得有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用.而觉得无状态是每次调用实例化一次,不保留用户信息.细致分析并用实践检验后,会发现,事实 ...

  6. IOS计划 分析

    1.基本介绍 IOS苹果公司iPhone.iPod touch和iPad操作系统和其他设备的发展. 2.知识点 1.IOS系统 iPhone OS(现在所谓的iOS)这是iPhone, iPod to ...

  7. &quot;CoolReaper&quot; --酷派手机后门

    文章转自:http://drops.wooyun.org/tips/4342 注:译文未获得平底锅授权,纯属学习性质翻译 原文:https://www.paloaltonetworks.com/con ...

  8. Eclipse扩展安装插件方式

    Eclipse安装插件经常使用的是直接安装的方式,就是将插件中包含的plugins和features文件夹中的内容直接复制到了Eclipse的plugins和features文件夹内,这样很容易导致插 ...

  9. Git 常用命令手记 及 Github协同流程(转)

    符号约定俗成:<xxx> 自定义内容xxx:[xxx] xxx为可选项:[<xxx>] 自定义内容xxx且为可选项. 说明/备注 命令 备注 保存更新 git add [-i] ...

  10. MySQL进口.sql文件和常用命令

    MySQL进口.sql文件和常用命令 在MySQL Qurey   Brower中直接导入*.sql脚本,是不能一次运行多条sql命令的.在mysql中运行sql文件的命令: mysql> so ...