Android的设计为大多数开发者能够使用默认的设置构建应用程序,而不需要在安全性方面作出更多的思考。Android还有许多操作系统内置的安全功能,大幅度减少应用程序安全性的问题和频率。

一些安全特性可以帮助开发人员构建安全的应用程序,其中包括:

1、Android应用程序沙箱在每个应用程序的基础上分离数据和执行代码。

2、 Android应用程序框架实现了共同的安全功能,如加密,权限,安全的进程间通信。

3、像ASLR, NX, ProPolice, safe_iop,OpenBSD dlmalloc, OpenBSD calloc, 和 Linux mmap_min_addr 的技术以减轻相关的风险与常见的内存分配错误

4、加密的文件系统可保护设备数据丢失或被盗

然而,重要的是为开发人员熟悉Android安全的最佳做法,以确保开发者使用这些个功能的优势,减少无意引入的安全问题,这些无意引入的问题可能影响到应用程序的安全性。

本文档围绕共同的API和开发技术,可以为你的应用程序及用户的安全隐患提供最佳的做法,而最佳实践是不断发展的,建议随时检测应用程序的开发过程

本文包括:

Ø 使用虚拟机代码

Ø 使用本地代码

Ø 数据存储

Ø 使用IPC

Ø 使用权限

Ø 使用网络

Ø 动态加载代码

Ø 执行输入验证

Ø 处理用户数据

Ø 使用加密

1) 使用虚拟机代码

编写安全的代码在虚拟机中运行是一个研究性的课题,很多问题都没有具体到Android中,这里并不企图重提这些话题,建议使用已有的文献,请看下面的两个链接:

1、http://www.securingjava.com/toc.html

2、https://www.owasp.org/index.php/Java_Security_Resources

这篇文章重点关注Android特性或者不同环境下的安全性问题。对于在其他虚拟机环境中有编程经验的开发者,也有可能编写Android应用程序,其中有两大问题:

3、一些虚拟机,如JVM或.net运行时,作为一个安全边界,从底层操作系统功能上隔离代码。在Android上,Dalvik虚拟机并不是一个安全边界,在操作系统级别上实现应用程序沙箱,这样,虚拟机能够在没有任何安全限制下,在相同的应用程序中操作本地代码。

4、考虑到移动设备上有限的存储空间,使得开发者都愿意建立模块化的应用程序,并实现动态加载。当考虑到这两点,要确保源和应用程序逻辑都存储在本地。没有验证的来源不要使用动态加载,不安全的网络资源或外部存储等,因为这些代码可以修改,可能包含着恶意行为。

2) 使用本地代码

一般情况下,我们鼓励开发者使用Android SDK开发应用程序,而不是使用本机代码(*.so),本地代码构建的应用程序更复杂,更便携,但对于常见的内存损坏错误,如缓冲区溢出等问题不好控制。

Android是使用Linux内核,如果你要使用本机代码,那么熟悉Linux开发安全的最佳方法是非常有必要的。讨论这些最佳做法这篇文章是太短了,但可以参考Linux和Unix的“安全编程”,可点击此链接查看:http://www.dwheeler.com/secure-programs

Android和大多数Linux环境之间的一个重要却别是应用程序沙箱。在Android中,所有的应用程序运行都在应用程序沙箱,包括本机代码。在最基本的水平,熟悉Linux的开发人员认为它是一个好办法,要知道,每个应用程序都被赋予一个唯一的UID,以及非常有限的权限。在Android安全性概述中将详细讨论这个问题,你应该熟悉应用程序的权限,即使您在使用本地代码。

3) 存储数据

1、使用内部文件

在默认情况下,Android创建文件只能创建在内部存储器上,这种保护是由Android实现的,对于大多数应用程序这以及足够了,因为不提供特定应用程序访问数据格式的能力,也不提供任何数据的控制能力,作为一个替代的方案,你可以考虑使用ContentProvider提供读取和写入权限,可以动态授权。

为敏感数据提供额外的保护,一些应用程序选择用一个Key加密本地的文件。(例如,一个键可以被放置在一个KeyStore保护用户密码但不存储在设备上)。虽然这并不从根本上进行保护,如果设备丢失,并且没有对文件系统加密,那么它可以通过监视用户输入的密码保护数据。

2、使用外部存储

在外部存储中创建文件,如:SD卡,能够供所有程序读写。由于外部存储可由用户移除,任何应用程序都可以修改存储数据。建议应用程序不要使用外部存储器存储敏感信息

任何不可信任的数据来源,从外部存储数据时应用程序应该要执行输入验证。我们强烈建议应用程序动态加载之前保存在外部存储的可执行文件或类文件。如果应用程序是从外部存储检索可执行文件,应该签署和加密验证的动态加载之前。

3、使用Context providers

ContentProviders提供了结构化的存储机制。可在自己的应用程序中允许或限制其他应用访问。默认情况下,一个ContentProviders允许其他应用程序使用。如果不打算其他应用程序访问你的ContentProvider,可在应用程序的mainfest中设置android:exported=false。

当创建一个ContentProvider给其他应用程序使用,可单独指定读/写权限。建议给定的权限能完成当前的工作即可。

如果你使用ContentProvider在统一开发者不同应用程序中进行数据共享,最好使用签名级别的权限。签名权限不需要用户确认,这样可提供更好的用户体验和访问控制。

更多的设计方法请看官方文档,能看懂意思但还没到达翻译的水平,也就写到这里好了。我想我更多的任务可能还是下文,而非翻译。实在抱歉~

4) 使用IPC

5) 使用权限

6) 使用网络

7) 动态加载代码

8) 执行输入验证

9) 处理用户数据

10)使用加密

原创文章,转载请注明出处:http://blog.csdn.net/tangcheng_ok

更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. android EditText设置不可写
  6. android 使用html5作布局文件: webview跟javascript交互
  7. android studio调试c/c++代码
  8. Android(安卓)Resource介绍和使用
  9. "Failed to fetch URL https://dl-ssl.google.com/android/repos

随机推荐

  1. 丢失android系统库或Conversion to Dalvi
  2. 用Xamarin 实现园友的 :Android浮动小球与
  3. Android 开机log以及常见异常
  4. Android(安卓)Eventbus控件发送与接收
  5. android中解析文件的三种方式
  6. Android数据库升级
  7. Android下uid与多用户释疑(一)
  8. Android(安卓)源码解析 - ScrollView
  9. android的init实例
  10. Android 原生页面同H5交互