Android的安全与权限(1)

Android是一个多进程系统,每一个应用程序(和系统的组成部分)都运行在自己的进程中。在应用程序和系统间的安全通过标准的Linux设备在进程级被执行,例如被分配给应用程序的用户和组ID。额外的颗粒度安全特性通过"许可"机制来提供,该机制能够对一个指定进程可实现的特定操作进行约束。

(1)安全结构

Android安全中的一个重要的设计要点是在默认情况下应用程序没有权限执行对其他应用程序、操作系统或用户有害的操作。这些操作包括读/写用户的隐私数据(如联系方式或E-mail),读/写其他应用程序的文件,执行网络访问、保持设备活动等。

应用程序的进程是一个安全的沙箱,它不能干扰其他应用程序,除非在它需要添加原有沙箱不能提供的功能时,它将明确声明权限。这些权限请求能够被不同方式的操作所处理。特别地,基于证书和用户的提示将被自动允许或禁止。权限的请求是在那个应用中通过一个应用程序被声明为静态的,所以在此之后,在安装或没有改变时它们会预先知道。

(2)应用程序签名

所有的Android应用程序(.apk文件)必须通过一个证书的签名,此证书的私钥必须被开发者所掌握。这个证书的标识是应用程序的作者。这个证书不需要通过证书组织的签署。Android应用程序对于使用自签署的证书是完全允许的和特别的,这个证书仅被用于与应用程序建立信任关系,而不是为了大规模地控制应用程序是否被安装。最重要的方面是通过确定能够访问原始签名权限和能够共享用户ID的签名来影响安全。

(3)用户标识和文件访问

安装在设备中的每一个Android包文件(.apk)都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

因为安全执行发生在进程级,所以一些不同包中的代码在相同进程中不能正常地运行,既然它们需要以不同的Linux用户身份运行。开发者可以使用每一个包中的AndroidManifest.xml文件中的 manifest 标签属性 sharedUserID 拥有它们分配的相同用户ID。通过这样做,两个包被视为相同的应用程序的安全问题就被解决了。注意:为了保持安全,仅有相同签名(和请求相同sharedUserID标签)的两个应用程序签名将会分配相同的用户ID。

应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。当通过getSharedPreferences(String,int)、openFileOutput(String、int)或者openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)创建一个新文件时,开发者可以同时或分别使用MODE_WORLD_READABLE和MODE_WORLD_RITEABLE标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。

(4)权限命名

一个基本的Android应用程序没有与其相关联的权限,意味着它不能做任何影响用户体验或设备中数据的有害操作。要利用这个设备的保护特性,在自己的应用程序需要时,开发者必须在AndroidManifest.xml文件中包含一个或更多的<uses-permission> 标签来声明此权限。

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.app.myapp" >
<uses-permission android:name="android.permission.RECEIVE_SMS" />
</manifest>

在安装应用程序时,通过包安装器,应用程序要通过权限请求的许可。如果在应用运行期间对用户不做检查,它要么在安装时被授予特定的许可,并且使用某种特性;要么不被授予许可,并且使得一切使用特性的尝试失败而不提示用户。

通常情况下,如果许可检查失败,应用将收到一个SecurityException事件。但是这并不能保证总是发生,例如,BroadcastIntent(Intent)方法就是当数据发送到每个接收器时的许可检查,在方法调用返回后,许可检查失败时应用就不会收到一个异常。然而在所有例子中,许可检查失败都会被打印到系统日志中。通常地,多次许可错误会产生抛回至应用程序的 SecurityException 异常。

Android系统提供的许可可以在Manifest.permission中找到。每个引用也可以定义和执行它自己的许可,因此它不是全面的所有可能的许可列表。

在程序运行期间,个别权限在一些地方可能被强制:

在系统接到呼叫时,预防一个应用程序去执行特定的函数;

在启动一个活动时,防止一个应用启动其他应用程序的活动;

发送和接收意图广播时,控制谁能接收你的广播或者谁能发送广播给你;

访问和操作一个内容提供器;

绑定或开始一个服务。

(5)权限的声明和支持

为了执行自己的权限,开发者必须首先在自己的AndroidManifest.xml中使用一个或多个<permission>标签声明它们。

例如,一个应用程序想用权限控制谁能启动一个活动,它可以声明一个允许这个操作的许可,如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.me.app.myapp" >
<permission 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" />
</manifest>




更多相关文章

  1. Android应用程序窗口View的创建过程
  2. 第三部分:Android 应用程序接口指南---第二节:UI---第五章 设置(Set
  3. Android 应用程序发布流程注意事项(整理)
  4. Android的读写文件权限
  5. Android不想要第三方的library的权限的时候
  6. Android 登陆界面及记住用户名密码
  7. Android /data/data/app_file/目录下面安装apk无权限问题

随机推荐

  1. Android图片圆角处理
  2. android涂鸦
  3. 《Android(安卓)基础(十二)》 TextInputLay
  4. Android(安卓)Google 地图学习
  5. Android打电话&发短信
  6. Android(安卓)cts测试命令
  7. Android在外部修改了工程名文件夹名称,报
  8. Android项目初始时的文件
  9. android 使用AsyncTask代替thread进行网
  10. Android(安卓)UI控件Spinner控件的学习