应用程序如何获取系统权限

来源:互联网 发布:qt udp socket编程 编辑:程序博客网 时间:2024/05/16 13:53

Android是一个多进程系统,每一个应用程序(和系统的组成部分)都运行在自己的进程中。通过进程ID,系统可以区分不同的应用程序和系统组件,并赋予不同的权限。更细粒度的安全特性则通过“许可”机制来提供,该机制能够对一个进程可执行的操作进行约束。 

Android安全机制中的一个重要特点是在默认情况下应用程序没有权限执行对其它应用程序、操作系统或用户有害的操作。这些操作包括读/写用户的隐私数据(例如联系方式或e-mail)、读/写其它应用程序的文件、访问网络、阻止设备休眠等等。 应用程序的进程是一个安全的sandbox,它的资源不能被外界访问,也不能访问其它应用程序。 为了在应用之间共享资源,必须显式地声明,而在声明自己提供的资源的同时,可以要求使用方具备相应的权限。应用程序在manifest中声明自己需要拥有的权限,在安装时向系统请求,安装程序通过用户的反馈和验证应用程序的作者予以确认。

所有的Android应用程序(.apk文件)必须通过一个证书的签名,此证书的私钥必须被开发者所掌握。这个证书的标识是应用程序的作者。这个证书不需要通过证书组织的签署:Android应用程序对于使用自签署的证书是完全允许的。这个证书仅仅被用于确认应用程序的作者。很重要的一点是:系统可以通过验证签名来赋予相应的权限,下面分别表述。 

一方面,安装在设备中的每一个Android包文件(.apk)都会被分配给一个唯一的Linux用户ID。用户ID 在应用程序安装到设备中时被分配,并且在它的生存期间保持不变。 因为安全检查基于进程,所以不同包中的代码必须以不同的Linux用户身份运行,而不能运行在同一个进程中。如果有需要,可以使用每一个包中的AndroidManifest.xml文件中的manifest 标签属性sharedUserId 给它们分配相同用户ID。通过这样做,两个包被视为同一个应用程序,安全问题被绕开了。为了保证安全,仅有相同签名(并请求相同sharedUserId)的两个应用程序允许分配相同的用户ID。 要让它们运行在同一个进程中,还需要进一步配置android:process。

另一方面,许可(permission)本身分为四个保护级别,分别为normal、dangerous、signature和signatureOrSystem。其中signature级别的许可只有相同签名的应用程序可以获取,而signatureOrSystem级别的许可只有使用系统用户签名或系统内置应用可以获取。

终上,使用系统提供的功能,有三种权限获取方式,最容易的是直接在manifest中申请,申请不到的考虑使用system用户的keystore来签名,实在不行再加上 android:sharedUserId="android.uid.system"。

网上搜索到的几种使用system签名的方式都不太方便,每次签名都需要使用系统编译环境,我总结一下生成JKS格式的keystore文件的方法,这样可以直接在eclipse中使用,非常方便。Debug时的使用方式为:window->Preferences->Android->Build->Custom debug keystore,release时的使用方式为:右键点击对应工程->Export->Android->Export Android Application->使用生成的keystore文件签名即可,密码为android。

生成keystore文件的步骤如下:

1. 进入android源码根目录

2. cd build\target\product\security //其中platform.pk8是system用户的key,platform.x509.pem是system用户的证书

3. openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem //将key文件转成pem格式

4. openssl pkcs8 -topk8 -nocrypt -in platform.pem -inform PEM -out key.der -outform DER //将key文件转成der格式

5. openssl x509 -in platform.x509.pem -inform PEM -out cert.der -outform DER //将证书文件转成der格式

6. http://www.agentbob.info/agentbob/80/version/default/part/AttachmentData/data/ImportKey.java //获取转换工具

7. 修改ImportKey.java中的keypass的值为android,defaultalias的值为androiddebugkey

8. javac ImportKey.java

9. java -Dkeystore=platform.keystore ImportKey key.der cert.der

0 0