本文翻译自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. Html5响应式设计与实现广场

    由于提出的想法响应式设计,越来越多的网站使用这样的思想.各类大型网站如雨后春笋般涌了出来.例如:小米商城.天猫等. 至于响应式设计的概念等大家能够去百度百度,我这里就不相信解说了.直接为大家带来源代码 ...

  2. 错误21002:[SQL-DMO]用户"xxx"已经存在

    原文:错误21002:[SQL-DMO]用户"xxx"已经存在 转载自:http://topic.csdn.net/u/20120829/09/faf381b6-d4e9-4f97 ...

  3. js 模块化的规范

           The Module Pattern,模块模式,也译为模组模式,是一种通用的对代码进行模块化组织与定义的方式.这里所说的模块(Modules),是指实现某特定功能的一组方法和代码.许多现 ...

  4. Error opening zip file or JAR manifest missing : D:\play-1.2.5/framework/play-1.2.5.jar

    play框架写的项目,在eclipse中导入.build-path中全部jar包都加入.执行程序,出现: Error occurred during initialization of VM agen ...

  5. Codefoces 432 C. Prime Swaps

    哥德巴赫猜想: 任一大于2的偶数,都可表示成两个素数之和. 任一大于5的整数都可写成三个质数之和. 贪心取尽可能大的素数..... C. Prime Swaps time limit per test ...

  6. dapper+linq+json+ztree构建树

    dapper获取实体的集合 /// <summary> /// 获取表tb_sys_zhuowei所有数据 /// </summary> public IEnumerable& ...

  7. ASP.NET MVC常见问题解决方法

    1.页面报错: The following errors occurred while attempting to load the app. - No assembly found containi ...

  8. [Python]sqlite3二进制文件存储问题(BLOB)(You must not use 8-bit bytestrings unless you use a text_factory...)

    事情是这种: 博主尝试用Python的sqlite3数据库存放加密后的usernamepassword信息,表是这种 CREATE TABLE IF NOT EXISTS user ( userID ...

  9. 深入浅出java并发

    http://www.blogjava.net/xylz/archive/2010/07/08/325587.html

  10. Shark集群搭建配置

    一.Shark简单介绍 Shark是基于Spark与Hive之上的一种SQL查询引擎,官网的架构图及性能測试图例如以下:(Ps:本人也做了一个性能測试见Shark性能測试报告) 我们涉及到了2个依赖组 ...