Android应用程序的权限机制
作者:网络转载 发布时间:[ 2013/1/22 10:22:19 ] 推荐标签:
(一)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消息的应用程序将要指定如下内容:
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11