Android应用程序的权限机制

发表于:2011-06-24来源:未知作者:娃娃点击数: 标签:
(一)Android安全架构 Android安全架构中一个中心思想就是:应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作。 一个应用程序的进程就是一个安全的沙盒。它不能干扰其它应用程序,除非显式地声明了“permis

  (一)Android安全架构

  Android安全架构中一个中心思想就是:应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作。

  一个应用程序的进程就是一个安全的沙盒。它不能干扰其它应用程序,除非显式地声明了“permissions”,以从而获取基本沙盒所不具备的能力。对于应用程序请求的“permissions” 可以有几种处理方式:如自动允许该权限,通过用户提示或者证书来允许或禁止该权限。应用程序需要的“permissions”在程序中静态声明,在程序安装时被系统知晓,并不会再改变。

  所有的Android应用程序(.apk文件)必须用数字证书进行签名认证,该证书的私钥由开发者保有。该证书可用以识别应用程序的作者。该证书无需CA签名认证(注:CA就是一个第三方的证书认证机构,如verisign等)。Android应用程序允许(而且一般也都是)使用self-signed证书(自签名证书)。证书主要用于在应用程序之间建立信任关系,而不是用于控制程序是否可以安装。签名影响安全性的最重要的方式是通过决定谁可以进入基于签名的permisssions,以及谁可以共享用户IDs。

  (二)应用程序的用户IDs和数据访问机制

  应用程序的用户IDs:

  每一个Android应用程序(.apk文件)都会在安装时获取一个独有的Linux用户ID,这就为它建立了一个沙盒,使其不能与其他应用程序进行接触。该用户ID在安装时分配,并在该设备上一直保持同一数值。

  由于安全性限制措施是发生在进程级,所以两个package中的代码不会运行在同一个进程当中,而是作为不同的Linux用户出现。我们可以通过使用AndroidManifest.xml文件中的manifest标签的sharedUserId属性,来使不同的package共用同一个用户ID。通过这种方式,这两个package就会被认为是同一个应用程序,拥有同一个用户ID(实际不一定),并且拥有同样的文件存取权限。

  注意:为了保持安全,仅当两个应用程序被同一个签名签署的时候(并且请求了同一个sharedUserId)才会被分配同样的用户ID。

  数据访问机制:

  所有存储在应用程序中的数据都会被赋予一个属性——该应用程序的用户ID,这使得其他应用程序无法访问这些数据。当通过以下方法getSharedPreferences(String, int),openFileOutput(String, int)或者 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)来创建一个新文件时,你可以通过使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE标志位来设置是否允许其他应用程序来读写这个文件。当设置这些标志位时,该文件仍然属于该应用程序,但是它对于其他任何应用程序也是可见的。

  (三)权限(permission)

  权限用来描述是否允许做某件事。Android系统中权限分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system)。系统中所有预定义的权限根据作用的不同,分别属于不同的级别。

  对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限,应用程序拥有platform级别的认证才能申请。当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。

  系统应用可以使用任何权限。权限的声明者可无条件使用该权限。

  目前Android系统定义了许多权限,通过SDK文档用户可以查询到哪些操作需要哪些权限,然后按需申请。

  要赋予应用程序权限,首先要在AndroidManifest.xml中使用一个或多个 标签进行声明。例如,一个应用程序想用控制谁能启动一个activities,它可以为声明一个该操作的许可,如下:

  

  

  android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"

  android:label="@string/permlab_deadlyActivity"

  android:description="@string/permdesc_deadlyActivity"

  android:permissionGroup="android.permission-group.COST_MONEY"

  android:protectionLevel="dangerous"

  />

  

 

 

 

  (四)使用权限(uses-permission)

  应用需要的权限应当在users-permission属性中申请,所申请的权限应是已经被系统或某个应用程序定义过的,否则视为无效申请。同时,使用权限的申请需要遵循权限授予条件,非platform认证的应用程序无法申请高级权限。

  所以,应用程序的权限级别大致分为两种:

   第一种低级点的(permission的protectlevel属性为normal或者dangerous),其调用者apk只需声明即可拥有其permission。

   第二种高级点的(permission的protectlevel属性为signature或者signatureorsystem),其调用者apk就需要和被调用的apk一样拥有相同的signature。

  若想拥有所需的权限,必须在AndroidManifest.xml文件中包含一个或更多的 标签来声明此权限。

  例如低级权限需要监听来自SMS消息的应用程序将要指定如下内容:

原文转自:http://www.ltesting.net