Android uid和pid安全机制

万事须己运,他得非我贤。这篇文章主要讲述Android uid和pid安全机制相关的知识,希望能为你提供帮助。
#1、概述
android 安全机制来源于Linux, 并且以Linux权限管理为基础, 要了解Android的安全机制, 需要从linux中的安全机制了解开始, 而用户的权限管理又是linux安全机制的最基本的一个组成
#2.Android 系统中的UID、GID、GIDS与PID
在 Android 上, 一个用户 UID 标示一个应用程序。应用程序在安装时被分配用户 UID, 应用程序在设备上的存续期间内, 用户 UID 保持不变。对于普通的应用程序, GID即等于UID。

GIDS 是由框架在 Application 安装过程中生成, 与 Application 申请的具体权限相关。 如果 Application 申请的相应的 permission 被 granted , 而且有对应的GIDS, 那么 这个Application 的 gids 中将 包含这个 gids。记住权限(GIDS)是关于允许或限制应用程序( 而不是用户) 访问设备资源。Android 使用沙箱的概念来实现应用程序之间的分离和权限, 以允许或拒绝一个应用程序访问设备的资源, 比如说文件和目录、网络、传感器和 API。为此, Android 使用一些 Linux 实用工具( 比如说进程级别的安全性、与应用程序相关的用户和组 ID, 以及权限) , 来实现应用程序被允许执行的操作。

#3.android沙箱
Android“沙箱”的本质是为了实现不同应用程序和进程之间的互相隔离, 即在默认情况 下, 应用程序没有权限访问系统资源或其它应用程序的资源。每个APP和系统进程都被分配唯一并且固定的User Id, 这个uid与内核层进程的uid对应。每个APP在各自独立的Dalvik虚拟机中运行, 拥有独立的地址空间和资源。运行于Dalvik虚拟机中的 进程必须依托内核层Linux进程而存在, 因此Android使用Dalvik虚拟机和Linux的文件访问控制来实现沙箱机制, 任何应用程序如果想要访 问系统资源或者其它应用程序的资源必须在自己的manifest文件中进行声明权限或者共享uid。
安装在设备中的每一个apk文件, Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux 用户都会被分配到一个属于自己的统一的Linux用户ID, 并且为它创建一个沙箱, 以防止影响其他应用程序( 或者其他应用程序影响它) 。用户ID 在应用程序安装到设备中时被分配, 并且在这个设备中保持它的永久性。

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.
4.uid pid
PID: 为Process Identifier,  PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收, 可能会被继续分配给新运行的程序, 但是在android系统中一般不会把已经kill掉的进程ID重新分配给新的进程, 新产生进程的进程号, 一般比产生之前所有的进程号都要大。
UID: 一般理解为User Identifier,UID在linux中就是用户的ID, 表明时哪个用户运行了这个程序, 主要用于权限的管理。而在android 中又有所不同, 因为android为单用户系统, 这时UID 便被赋予了新的使命, 数据共享, 为了实现数据共享, android为每个应用几乎都分配了不同的UID, 不像传统的linux, 每个用户相同就为之分配相同的UID。( 当然这也就表明了一个问题, android只能时单用户系统, 在设计之初就被他们的工程师给阉割了多用户) , 使之成了数据共享的工具。
因此在android中PID, 和UID都是用来识别应用程序的身份的, 但UID是为了不同的程序来使用共享的数据。
#5.通过uid共享数据
在android 中要通过UID共享数据只需在程序a,b中的menifest配置即可, 具体如下:
< manifest xmlns:android= " http://schemas.android.com/apk/res/android" package= " com.perseus.a" android:versionCode= " 1" android:versionName= " 1.0" android:sharedUserId= " com.share" > < manifest xmlns:android= " http://schemas.android.com/apk/res/android" package= " com.perseus.b" android:versionCode= " 1" android:versionName= " 1.0" android:sharedUserId= " com.share" >

这样的话你也许会有疑问, 如果让其他的开发这知道了我们的shareUserId知道了我们的ID, 那我们的数据不是暴露了, 放心吧google不会犯这样的低级错误的, 我们要使不同的程序能够相互访问, 还需要拥有相同的签名, 每个公司或者开发者的签名是唯一的, 这样我们就不用担心了, 另外两者能够访问, 别忘了权限
【Android uid和pid安全机制】参考:
http://dengzhangtao.iteye.com/blog/1989065
http://blog.csdn.net/vshuang/article/details/43639211
http://www.cnblogs.com/perseus/articles/2354173.html

    推荐阅读