【Android平台安全方案】の #00-请不要在外部存储(SD卡)加密存储的敏感信息
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卡)加密存储的敏感信息的更多相关文章
- Android相机、相册获取图片显示并保存到SD卡
Android相机.相册获取图片显示并保存到SD卡 [复制链接] 电梯直达 楼主 发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图 本帖最后由 happy小妖同学 ...
- Android全屏截图的方法,返回Bitmap并且保存在SD卡上
Android全屏截图的方法,返回Bitmap并且保存在SD卡上 今天做分享,需求是截图分享,做了也是一个运动类的产品,那好,我们就直接开始做,考虑了一下,因为是全屏的分享,所有很自然而然的想到了Vi ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- android 数据存储<一>----android短信发送器之文件的读写(手机+SD卡)
本文实践知识点有有三: 1.布局文件,android布局有相对布局.线性布局,绝对布局.表格布局.标签布局等,各个布局能够嵌套的. 本文的布局文件就是线性布局的嵌套 <LinearLayout ...
- Android之外部存储(SD卡)
*手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...
- android 数据存储----android短信发送器之文件的读写(手机+SD卡)
本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...
- android:http下载文件并保存到本地或SD卡
想把文件保存到SD卡中,一定要知道SD卡的路径,获取SD卡路径: Environment.getExternalStorageDirectory() 另外,在保存之前要判断SD卡是否已经安装好,并且可 ...
- android中使用Http下载文件并保存到本地SD卡
1.AndroidMainfest.xml中设置权限 <uses-permission android:name="android.permission.INTERNET"& ...
- Android——数据存储:手机外部存储 SD卡存储
xml <EditText android:layout_width="match_parent" android:layout_height="wrap_cont ...
随机推荐
- Java版网络爬虫基础(转)
网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...
- 【高德地图API】从头德国高中生JS API(三)覆盖物——大喊|折线|多边形|信息表|聚合marker|点蚀图|照片覆盖
覆盖物,是一张地图的灵魂.有覆盖物的地图.才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具).最重要最必不可少的就是覆盖物了.覆盖物有多种.包含.标注.折线.多 ...
- Mapxtreme C#鹰眼地图
Demo演示程序下载地址: http://pan.baidu.com/s/1jG9gKMM#dir/path=%2F%E4%BA%A7%E5%93%81%2FDemos 找:EagelEyeMap.r ...
- Code digest
private void travelDir(String filepath) { String threadName = Thread.currentThread().toString(); log ...
- (大数据工程师学习路径)第四步 SQL基础课程----修改和删除
一.准备 在正式开始本内容之前,需要先从github下载相关代码.该代码可以新建两个数据库,分别名为test_01和mysql_shiyan ,并在mysql_shiyan数据库中建4个表(depar ...
- JavaScript中的分号插入机制
原文:JavaScript中的分号插入机制 仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 functi ...
- 最新Oracle 和 mysql 的对比参照----开发篇(转)
Oracle mysql 对比版本 Release 10.2.0.1.0 XE windowsXP 5.0.45-community-nt-log MySQL Community Edition ( ...
- .NET系统开发过程中积累的扩展方法
分享.NET系统开发过程中积累的扩展方法 .NET 3.5提供的扩展方法特性,可以在不修改原类型代码的情况下扩展它的功能.下面分享的这些扩展方法大部分来自于Code Project或是Stacko ...
- 查询oracle sql运行计划,一个非常重要的观点--dba_hist_sql_plan
该文章的作者给予了极大的帮助长老枯荣,为了表达我的谢意. 这适用于oracle db版本号oracle 10g或者更高的版本号. 之所以说这种看法是非常重要的,因为观点是有之一awrsqrpt报告没有 ...
- JavaScript编写了一个计时器
初学JavaScript,用JavaScript编写了一个计时器. 设计思想: 1.借助于Date()对象,来不断获取时间点: 2.然后用两次时间点的毫秒数相减,算出时间差: 3.累加时间差,这样就能 ...