安全与权限

来源:互联网 发布:linux 对文件进行排序 编辑:程序博客网 时间:2024/04/29 04:49

安全与权限

Android是一个多进程系统,每个应用都运行在自己的进程中。应用与系统的大多数安全是进程级别的,通过标准的linux设施,比如用户和组ID。另外更细的安全特性通过权限被提供. “权限规定了一个特别的进程所能进行的某些特定操作,每个URI权限都规定对特定的数据存取的权限。

安全架构

Android 安全架构的一个中心设计点就是没有一个应用都没有权利对其他应用,操作系统,用户执行任何具有不利影响的操作。这包括读写用户的私有数据(比如联系人或是email), 读写其他应用的文件,网络存取,保持设备活动等等。

一个应用的进程就是一个安全沙箱。它不能打扰其他应用,除非显示地声明权限说明它需要额外的能力而不是通过基本的沙箱。这些权限能够通过各种方式来操作, 典型的是通过基于证书允许或是不允许或者自动提升用户权限。应用所允许的权限能够在应用静态地声明。 以至他们在安装时候预知而后将不改变。

应用签名

所有Android 应用(.apk文件)必须用一个证书签名,其私钥被开发者所持有。 该证书用于验证应用。 这个证书可以不必采用官方的证书签名。 该证书被创建仅用于应用间的信任关系。签名安全影响主要的方式通过决定谁存取签名权限和谁能共享用户ID

用户IDs和文件存取

安装在设备上每个Android包(.apk)文件都被赋予每一个唯一的linux用户ID.为它创建一个沙箱,阻止其他应用干扰。当应用安装在设备上,每个应用所赋予的用户ID是一个常量,而且将在设备的生命周期保持不变。

因为安全执行发生在进程级别,任何两个包的代码都不能再同一个进程运行,因为他们需要运行在不同的linux用户. 你可以在AndroidManifest.xml使用shareUserId属性, 已赋予共同的用户ID.通过这样做,其目的在于两个包的安全是出于同一应用上,具有相同的用户ID和文件存取权限。

    注意为了保持相同安全,两个应用必须采用同一个签名(并且需要相同的shareUserID)将被赋予同一个用户ID号。

       任何存储在应用的数据都将分配应用的用户ID,不能正常的存取其他包的数据。当要用getSharePreferences(String, int), openFileOutputopenOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)创建一个文件, 可以用MODE_WORLD_READABLE MODE_WORLD_WRITEABLE 标记允许其他包读写该文件。当设置了这些标志,文件将仍然被你的应用所有,但是文件的全局读写权限将可以被设置使得其他应用可以使用它。

用户权限

    一个基本的Android 应用没有权限和它相关联, 这就意味着它将不能做任何事来影响设备上的用户体验或是数据。为了充分使用设备的保护特征,你必须在你的AndroidManifest.xml声明一个或多个<users-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>

    应用所需要的权限将在安装时赋予, 基于应用签名或者与用户交互.

一个特别的权限可能在你的一下程序操作中执行:

1. 系统调用时, 是为了阻止一个应用执行一定的操作.

   2. 当启动一个Activity, 阻止应用启动其他应用的activities;

   3. 接受发送广播, 以控制谁接受你的广播或者谁发送一个广播给你.

   4. 当存取或操作的一个Content provider.

   5. 绑定或启动一个服务。

声明和执行权限

     为了执行你自己的权限,你必须首先在AndroidManifest.xml使用<permission>申明。

比如,一个应用想要控制谁启动一个Acitivity将做如下申明这个操作的权限:

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

       你能够查看权限通过shell 命令 adb shell pm list permissions. “ –s ”为显示权限格式。

URI Permissions

当使用content providers, 标准权限系统并不是很有效。一个content provider可能想要保护自己使用读写权限。当它直接的客户端可能需要处理特别的URIs给其他应用操作。一个典型的例子就是一个email应用的附件。由于邮件是敏感的用户数据,获取邮件应该通过权限获得保护。然而一个Image 附件的URI是给一个Image 视图。Image 视图没有任何权限打开附件以致于它没有任何理由持有权限来存取所有email.

这样问题的解决方案是URI 权限: 当启动一个activity或则返回一个结果给一个activity. 调用者能够设置Intent.FLAG_GRANT_READ_URI_PERMISSION或者Intent.FLAG_GRANT_WRITE_URI_PERMISSION. 这个赋予接收activity 权限存取特别的数据URI.

原创粉丝点击