沙箱、进程和权限
在 Linux 中,一个用户 ID 识别一个给定用户;在 Android 上,一个用户 ID 识别一个应用程序。应用程序在安装时被分配用户 ID,应用程序在设备上的存续期间内,用户 ID 保持不变。权限是关于允许或限制应用程序(而不是用户)访问设备资源。
Android 使用沙箱的概念来实现应用程序之间的分离和权限,以允许或拒绝一个应用程序访问设备的资源,比如说文件和目录、网络、传感器和 API。为此,Android 使用一些 Linux 实用工具(比如说进程级别的安全性、与应用程序相关的用户和组 ID,以及权限),来实现应用程序被允许执行的操作。
两个 Android 应用程序,各自在其自己的基本沙箱或进程上
![图:两个 Android 应用程序,各自在其自己的基本沙箱或进程上(具有不同的用户 ID)](http://image49.360doc.com/DownloadImg/2012/02/0714/21333104_1.gif)
Android 应用程序运行在它们自己的 Linux 进程上,并被分配一个惟一的用户 ID。默认情况下,运行在基本沙箱进程中的应用程序没有被分配权限,因而防止了此类应用程序访问系统或资源。但是 Android 应用程序可以通过应用程序的 manifest 文件请求权限。
通过做到以下两点,Android 应用程序可以允许其他应用程序访问它们的资源:
声明适当的 manifest 权限
与其他受信任的应用程序运行在同一进程中,从而共享对其数据和代码的访问
后者演示在 图 2 中。
两个 Android 应用程序,运行在同一进程上
![图:两个 Android 应用程序,运行在同一进程上(具有相同的数字签名和相同的 Linux 用户 ID)](http://image49.360doc.com/DownloadImg/2012/02/0714/21333104_2.gif)
不同的应用程序可以运行在相同的进程中。对于此方法,首先必须使用相同的私钥签署这些应用程序,然后必须使用 manifest 文件给它们分配相同的 Linux 用户 ID,这通过用相同的值/名定义 manifest 属性 android:sharedUserId 来做到。
开发人员用例
图 3 演示了很多在开发 Android 应用程序时会发现的与安全性相关的用例。
图 3. 编写 Android 应用程序时出现的安全领域
![图:编写 Android 应用程序时出现的安全领域](http://image49.360doc.com/DownloadImg/2012/02/0714/21333104_3.gif)
应用程序或代码签名是这样一个过程,即生成私有、公共密钥和公共密钥证书,签署和优化应用程序。
权限是 Android 平台的一种安全机制,以允许或限制应用程序访问受限的 API 和资源。默认情况下,Android 应用程序没有被授予任何权限,不允许它们访问设备上受保护的 API 或资源,从而保证了它们的安全。权限必须被请求,定义了定制的权限,文件和内容提供者就可以受到保护。确保在运行时检查、执行、授予和撤销权限。
接下来,更加详细地来看一下每个安全领域。
所有 Android 应用程序都必须被签名。应用程序或代码签名是一个这样的过程,即使用私有密钥数字地签署一个给定的应用程序,以便:
识别代码的作者
检测应用程序是否发生了改变
在应用程序之间建立信任
基于这一信任关系,应用程序可以安全地共享代码和数据。
使用相同数字签名签署的两个应用程序可以相互授予权限来访问基于签名的 API,如果它们共享用户 ID,那么也可以运行在同一进程中,从而允许访问对方的代码和数据。
应用程序签名首先是生成一个私有、公共密钥对和一个相关公共密钥证书,简称为公共密钥证书。
构建 Android 应用程序时可以采用调试模式和发布模式:
使用 Android 构建工具(命令行和 Eclipse ADT)构建的应用程序是用一个调试私有密钥自动签名的;这些应用程序被称为调试模式应用程序。调试模式应用程序用于测试,不能够发布。注意,未签名的或者使用调试私有密钥签名的应用程序不能够通过 Android Market 发布。
您准备发布自己的应用程序时,必须构建一个发布模式的版本,这意味着用私有密钥签署应用程序。
Android 中的代码签名采用一种比其他移动平台中要简单得多的方式。在 Android 上,证书可以是自签名的,这就是说,无需证书授权。这种方法简化了发布过程和相关的成本。
接下来,介绍如何从命令行以及通过使用 Eclipse ADT 手动签署 Android 应用程序。本文中不介绍第三种方法,即使用 Ant。
手动创建私有、公共密钥和公共密钥证书
回想一下,调试模式应用程序是使用调试密钥/证书由构建工具自动签名的。要签署一个发布模式的应用程序,首先必须生成私有、公共密钥对和公共密钥证书。可以手动地或者通过使用 Eclipse ADT 签署应用程序。两种方法中都使用了 Java Developer Kit (JDK) keytool 密钥和证书管理实用工具。
要手动生成私有、公共密钥信息,可以从命令行使用 keytool,如 清单 1 所示。
清单 1