Android的安全性

作者:追风剑情 发布于:2016-7-14 19:34 分类:Android

Android的安全性
      关于Android安全性的很多内容都来源于底层的Linux内核。应用程序的文件和资源被放置在拥有它们的应用程序的沙盒中,从而使它们不能被其他的应用程序访问。Android提供了Intent、Service和Content Provider来放宽这些严格的进程边界,并使用权限机制来维护应用程序级别的安全。

      你已经学习了如何在manifest文件中使用<uses-permission>标签,通过权限系统来为应用程序请求对本地系统服务的访问——特别是访问基于位置的服务、联系人Content Provider和摄像头。

      下面的部分更加详细地探讨了Linux安全模型和Android权限系统。为了有一个全面的概念,Android文档提供了非常优秀的资源来深入地描述安全功能,其网址为developer.android.com/guide/topics/security/security.html

Linux内核安全
      每一个Android包在安装的时候,都会分配给它一个唯一的Linux用户ID。这个ID具有隔离进程和它所创建的资源的作用,这样它就不会影响其他的应用程序(或者受其他应用程序影响)了。

      由于这种内核级安全性的存在,要想在应用程序间进行通信,就需要额外的步骤。可以使用Content Provider、Intent、Service和AIDL接口。这些机制中的任何一个都在应用程序之间打开了一个信息流的通道。为了确保信息不会在目标接收者处“漏出”,Android权限在两端扮演了通道边界警卫的角色,它控制着是否允许数据通过这个通道。

权限简介
     权限是一种应用程序级的安全机制,它可以限制对应用程序组件的访问。权限可以用来阻止恶意破坏应用程序的数据,限制对敏感信息的访问以及对硬件资源或者外部通信信道的过度(或未授权)使用。

     很多Android本地组件都有对权限的要求。Android本地Activity和Service所使用的本地权限字符串在android.Manifest.permission类定义为静态常量。

要使用受权限保护的组件,需要在应用程序的manifest文件中添加<uses-permission>标签,指定每一个应用程序所要求的权限字符串。

     当安装一个应用程序包时,通过查看可信机构的评价和了解用户反馈,分析并授予(或拒绝)在应用程序的manifest文件中请求的权限。所有的Android权限检查都是在安装时进行的。一旦一个应用程序被安装了之后,就不会再提示用户重新评估它们的权限。

1.声明和实施权限
在向一个应用程序组件分配权限之前,需要使用<permission>标签在应用程序的manifest文件中定义权限。
例如:
<permission
android:name="com.paad.DETONATE_DEVICE"
android:protectionLevel="dangerous"
android:label="Self Destruct"
android:description="@string/detonate_description">
</permission>

     在permission标签中,可以指定权限允许的访问级别(normal、dangerous、signature、signatureOrSystem)、一个标签以及一个包含了对授予这个权限的风险进行了说明的外部资源。

     要为应用程序组件自定义权限要求,可以在应用程序的manifest文件中使用permission属性。可以在整个应用程序中实施权限限制,但是在应用程序接口边界处实施权限限制最有帮助,例如:

  • Activity 添加一个权限来限制其他应用程序启动某个Activity的能力。
  • Broadcast Receiver 控制哪个应用程序可以向你的接收器发送Broadcast Intent。
  • Intent 控制哪个Broadcast Receiver可以接受Broadcast Intent
  • Content Provider 限制对Content Provider的读取访问和写入操作。
  • Service 限制其他应用程序启动或者绑定到某个Service的能力。

在每一种情况中,都可以在程序的manifest文件的某个组件中添加一个permission属性。并指定访问每一个组件所要求的权限字符串。
例如:为Activity实施一个权限要求
<activity
android:name=".MyActivity"
android:label="@string/app_name"
android:permission="com.paad.DETONATE_DEVICE">
</activity>

<service
android:name=".MyService"
android:permission="com.paad.DETONATE_DEVICE">
</service>

<receiver
android:name=".MyReceiver"
android:permission="com.paad.DETONATE_DEVICE">
<intent-filter>
<action android:name="com.paad.ACTION_DETONATE_DEVICE"/>
</intent-filter>
</receiver>

Content Provider可以通过设置readPermission和writePermission属性来提供一个粒度更细的读写访问控制。
<provider
android:name=".HitListProvider"
android:authorities="com.paad.hitlistprovider"
android:writePermission="com.paad.ASSIGN_KILLER"
android:readPermission="com.paad.LICENSED_TO_KILL"/>
</provider>

2.在广播Intent时实施权限
     除了可以要求Broadcast Receiver所接收的Intent具有某些权限之外,还可以为你广播的每一个Intent附加上一个权限要求,当广播包含敏感信息的Intent(例如只能在你的应用程序中使用的位置更新)时,这就是一个很好实践。

在这种情况下,最好是设置一个signature权限,以确保只有当某个应用程序的签名与发送广播的应用程序相同时才能接收广播。
<permission
android:name="com.paad.LOCATION_DATA"
android:protectionLevel="signature"
android:label="Location Transfer"
android:description="@string/location_data_description">
</permission>

当调用sendIntent的时候,可以提供一个权限字符串,Broadcast Receiver只有拥有这个权限才能够接收Intent。这个过程如下所示:
sendBroadcast(myIntent, "com.paad.LOCATION_DATA");


   

标签: Android

Powered by emlog  蜀ICP备18021003号   sitemap

川公网安备 51019002001593号