PA10

来自tomtalk
Tom讨论 | 贡献2013年2月3日 (日) 22:25的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

在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>