PA10
在Android中,安全性贯穿着应用程序生命周期的所有阶段,从设计时的策略考虑到运行时边界检查。
10.1 理解Android安全性模型
在部署方面,Android应用程序必须使用数字证书签名,才能将它们安装到设备上。在执行方面,Android在独立进程中运行每个应用程序,每个应用程序都具有唯一且固定的用户ID(在安装时分配)。这围绕进程提供了一个边界,阻止了一个应用程序直接访问另一个应用程序的数据。而且,Android定义了一个声明性权限模型来保护敏感的信息(比如联系人列表)。
签名Android应用程序需要3个要素:数字证书、.apk文件和知道如何将数字证书的签名应用到.apk文件的实用程序。JDK发行版中包含一个免费的实用程序,名为jarsigner。这个实用程序是一个命令行工具,知道如何使用数字证书签名.jar文件。
证书具有有效期,Google建议将有效期设置得很长,以支持众多的应用程序更新。那么,如果证书到期了会发生什么?Android仍然会运行该应用程序吗?幸运的是,是这样的(Android仅在安装时测试证书的有效期)。安装了应用程序以后,即使证书过期了应用程序也可以继续运行。
那么更新又如何呢?不幸的是,在证书过期之后不能更新应用程序。换句话说,根据Google建议,需要确保证书的d寿命足够长,足以支持应用程序的整个生命期。
10.2 执行运行时安全性检查
Android中的运行时安全检查是在进程级别和操作级别上进行的。在进程级别,Android禁止一个应用程序直接访问另一个应用程序的数据。实现方法是,每个应用程序都在不同的进程中运行,使用唯一且固定的用户ID。在操作级别,Android定义了一组受保护的功能和资源。要使应用程序能够访问此信息,必须向AndroidManifest.xml文件添加一个或多个权限请求。也可以为应用程序定义自定义的权限。
在桌面环境中,大部分应用程序都使用相同的用户ID运行,与此不同的是,Android应用程序通常使用自己的唯一ID运行。通过使用不同的ID运行每个应用程序,Android围绕每个进行创建了一种隔离边界。这能够阻止一个应用程序直接访问另一个应用程序的数据。
尽管每个进程都具有边界,但应用程序之间的数据共享显然也可以实现,但必须显式地进行共享。换句话说,要获得另一个应用程序的数据,必须借助该应用程序的组件。例如,可以查询另一个应用程序的ContentProvider,可以调用另一个应用程序中的活动,或者可以与另一个应用程序的服务通信。所有这些途径都提供了在应用程序之间共享信息的方法,但它们以显式方式实现此目的,因为你不会访问基础的数据库、文件等内容。
进程边界上的Android安全性非常简单明了,而对资源(比如联系人数据)、功能(比如设备的照相机)和我们自己的组件保护就比较有趣了。为了提供此类保护,Android定义了一种权限方案。
关于权限的完整列表,请访问以下URL:
http://developer.android.com/reference/android/Manifest.permission.html
AndroidManifest.xml中的权限
<manifest … > <application> … </application> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.READ_CALENDAR" /> </manifest>