Android的安全性浅析.docx

上传人:b****5 文档编号:4449123 上传时间:2022-12-01 格式:DOCX 页数:20 大小:413.94KB
下载 相关 举报
Android的安全性浅析.docx_第1页
第1页 / 共20页
Android的安全性浅析.docx_第2页
第2页 / 共20页
Android的安全性浅析.docx_第3页
第3页 / 共20页
Android的安全性浅析.docx_第4页
第4页 / 共20页
Android的安全性浅析.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

Android的安全性浅析.docx

《Android的安全性浅析.docx》由会员分享,可在线阅读,更多相关《Android的安全性浅析.docx(20页珍藏版)》请在冰豆网上搜索。

Android的安全性浅析.docx

Android的安全性浅析

理解Android上的安全性

概述

Android包括一个应用程序框架、几个应用程序库和一个基于Dalvik虚拟机的运行时,所有这些都运行在Linux®内核之上。

通过利用Linux内核的优势,Android得到了大量操作系统服务,包括进程和内存管理、网络堆栈、驱动程序、硬件抽象层以及与本文主题——安全性——相关的服务。

常用缩写词

∙ADT:

Android开发工具

∙API:

应用程序编程接口

∙IDE:

集成开发环境

∙JDK:

Java开发包

∙URL:

统一资源标识符

∙XML:

可扩展标记语言

前提条件

要跟随本文,需要具备以下技能和工具:

∙基本了解Java™技术和如何使用Eclipse(或者您喜欢的IDE)

∙JavaDevelopmentKit(需要版本5或6)

∙Eclipse(版本3.4或3.5)

∙AndroidSDK和ADT插件

有关下载和设置方面的信息,请参见本文结尾的 参考资料 部分。

回页首

沙箱、进程和权限

用户ID:

Linux与Android

在Linux中,一个用户ID识别一个给定用户;在Android上,一个用户ID识别一个应用程序。

应用程序在安装时被分配用户ID,应用程序在设备上的存续期间内,用户ID保持不变。

权限是关于允许或限制应用程序(而不是用户)访问设备资源。

Android使用沙箱的概念来实现应用程序之间的分离和权限,以允许或拒绝一个应用程序访问设备的资源,比如说文件和目录、网络、传感器和API。

为此,Android使用一些Linux实用工具(比如说进程级别的安全性、与应用程序相关的用户和组ID,以及权限),来实现应用程序被允许执行的操作。

概念上讲,沙箱可以表示为 图1 所示。

图1.两个Android应用程序,各自在其自己的基本沙箱或进程上

 

Android应用程序运行在它们自己的Linux进程上,并被分配一个惟一的用户ID。

默认情况下,运行在基本沙箱进程中的应用程序没有被分配权限,因而防止了此类应用程序访问系统或资源。

但是Android应用程序可以通过应用程序的manifest文件请求权限。

通过做到以下两点,Android应用程序可以允许其他应用程序访问它们的资源:

∙声明适当的manifest权限

∙与其他受信任的应用程序运行在同一进程中,从而共享对其数据和代码的访问

后者演示在 图2 中。

图2.两个Android应用程序,运行在同一进程上

 

不同的应用程序可以运行在相同的进程中。

对于此方法,首先必须使用相同的私钥签署这些应用程序,然后必须使用manifest文件给它们分配相同的Linux用户ID,这通过用相同的值/名定义manifest属性 android:

sharedUserId 来做到。

回页首

开发人员用例

图3 演示了很多在开发Android应用程序时会发现的与安全性相关的用例。

图3.编写Android应用程序时出现的安全领域

 

∙应用程序或代码签名是这样一个过程,即生成私有、公共密钥和公共密钥证书,签署和优化应用程序。

∙权限是Android平台的一种安全机制,以允许或限制应用程序访问受限的API和资源。

默认情况下,Android应用程序没有被授予任何权限,不允许它们访问设备上受保护的API或资源,从而保证了它们的安全。

权限必须被请求,定义了定制的权限,文件和内容提供者就可以受到保护。

确保在运行时检查、执行、授予和撤销权限。

接下来,更加详细地来看一下每个安全领域。

回页首

应用程序签名

所有Android应用程序都必须被签名。

应用程序或代码签名是一个这样的过程,即使用私有密钥数字地签署一个给定的应用程序,以便:

∙识别代码的作者

∙检测应用程序是否发生了改变

∙在应用程序之间建立信任

基于这一信任关系,应用程序可以安全地共享代码和数据。

使用相同数字签名签署的两个应用程序可以相互授予权限来访问基于签名的API,如果它们共享用户ID,那么也可以运行在同一进程中,从而允许访问对方的代码和数据。

应用程序签名首先是生成一个私有、公共密钥对和一个相关公共密钥证书,简称为公共密钥证书。

构建Android应用程序时可以采用调试模式和发布模式:

∙使用Android构建工具(命令行和EclipseADT)构建的应用程序是用一个调试私有密钥自动签名的;这些应用程序被称为调试模式应用程序。

调试模式应用程序用于测试,不能够发布。

注意,未签名的或者使用调试私有密钥签名的应用程序不能够通过AndroidMarket发布。

∙您准备发布自己的应用程序时,必须构建一个发布模式的版本,这意味着用私有密钥签署应用程序。

Android中的代码签名采用一种比其他移动平台中要简单得多的方式。

在Android上,证书可以是自签名的,这就是说,无需证书授权。

这种方法简化了发布过程和相关的成本。

接下来,介绍如何从命令行以及通过使用EclipseADT手动签署Android应用程序。

本文中不介绍第三种方法,即使用Ant。

手动创建私有、公共密钥和公共密钥证书

回想一下,调试模式应用程序是使用调试密钥/证书由构建工具自动签名的。

要签署一个发布模式的应用程序,首先必须生成私有、公共密钥对和公共密钥证书。

可以手动地或者通过使用EclipseADT签署应用程序。

两种方法中都使用了JavaDeveloperKit(JDK)keytool密钥和证书管理实用工具。

要手动生成私有、公共密钥信息,可以从命令行使用 keytool,如 清单1 所示。

清单1.使用 keytool 生成私有/公共密钥和证书

keytool-genkey-v-alias-keystore

-keyalgRSA-keysize2048-validity

注意:

清单1 假设JDK已安装在您的计算机上,并且 JAVA_HOME 路径被正确定义为指向您的JDK目录(参见 参考资料,获得下载和设置信息)。

在 清单1 中,-genkey 表示一个公共、私有密钥对项,以及一个X.509v1自签署的单个元素证书链,其中包含生成的公共密钥。

-v表示冗长模式。

-alias 是用于keystore项的别名,keystore存储生成的私有密钥和证书。

-keystore 表示使用的密钥仓库的名称。

-keyalg 是用来生成密钥对的算法。

-keysize 是生成的密钥大小,其中默认大小是1024,但是推荐大小是2048。

-validity 是有效天数;推荐采用大于1000的值。

注意:

生成密钥之后,一定要保证密钥的安全。

不要共享私有密钥,也不要在命令行或脚本中指定密钥;注意,keytool和jarsigner会提示输入密码。

关于这一技巧和其他技巧,请参考AndroidDevelopers网站的“SecuringYourPrivateKey”(参见 参考资料 中的链接)。

Keytool 提示您输入名和姓、公司、城市、州、国家,从这些信息生成一个X.500DistinguishedName(更多信息请参见 参考资料),还要输入保护私有密钥和密钥仓库本身的密码。

对于有效期,请确保使用超出应用程序本身和相关应用程序预期生命期的时期。

如果您是在AndroidMarket上发布应用程序,那么有效期必须晚于2033年10月22日结束;否则不能上载。

此外,拥有长寿命的证书让升级应用程序更为容易。

幸运的是,AndroidMarket强制采用长寿命的证书,以帮助您避免此类问题。

手动签署应用程序

接下来,使用 jarsigner 工具(它是JDK的一部分)签署未签名的应用程序:

jarsigner-verbose-keystore

在上述代码中,-verbose 表示冗长模式,-keystore 表示使用的密钥仓库的名称。

接下来是应用程序的名称(.apk),最后是用于私有密钥的别名。

Jarsigner 提示您输入使用密钥仓库和私有密钥时的密码。

应用程序可以使用不同的密钥进行多次签名,用相同私有密钥签名的应用程序之间可以建立一种信任关系,并且可以运行在同一进程中,共享代码和数据。

手动优化应用程序

签署过程的最后一步是优化应用程序,以便数据边界与文件的开始是内存对齐的,这种技术有助于改善运行时性能和内存利用率。

要签署应用程序,可以使用 zipalign:

zipalign-v4your_project_name-unaligned.apkyour_project_name.apk

在前面的代码中,-v 表示冗长输出。

数字4表示使用四字节对齐(总是使用四字节)。

下一个参数是输入已签署应用程序的文件名(.apk),它必须用您的私有密钥签署。

最后一个参数是输出文件名;如果覆盖现有应用程序,则添加一个 -f。

手动验证应用程序已经签署

要验证应用程序已经签署,可以使用 Jarsigner,这次传递 -verify 标志:

jarsigner-verify-verbose-certsmy_application.apk

在前面的代码中,-verify 表示验证应用程序;-verbose 表示冗长模式;-certs 表示展示创建密钥的CN字段,最后一个参数是要验证的Android应用程序包的名称。

注意:

如果CN读入"AndroidDebug",那么意味着应用程序是用调试密钥签署的,这表明不能发布;如果您计划在AndroidMarket上发布您的应用程序,一定要记得使用私有密钥。

刚才学习了如何手动创建私有、公共密钥,以及签署和优化应用程序。

接下来,了解如何使用EclipseADT自动创建私有、公共密钥,以及签署和优化应用程序。

回页首

使用EclipseADT创建密钥和证书,以及签署和优化应用程序

要使用EclipseADT生成密钥,必须导出应用程序。

有两种方法从Eclipse导出应用程序:

∙导出您必须手动签署的应用程序的未签署 版本

∙导出应用程序的已签署 版本,其中所有步骤都由ADT为您代劳

导出未签署的应用程序

您可以导出您必须手动签署的应用程序的未签署版本。

就是说,您需要手动运行keytool(如前所述,是为了生成密钥)和Jarsigner(为了签署应用程序),并使用zipalign工具优化应用程序,跟前面解释的那样。

要使用ADT导出应用程序的未签署版本,可以右键单击项目并选择 AndroidTools>ExportUnsignedApplicationPackage(参见图4)。

图4.导出未签署的应用程序

 

选中之后,ADT提示您选择将未签署应用程序导出到的目录。

记住,一旦应用程序被导出,您就必须手动签署和优化应用程序,跟前面介绍的那样。

导出已签署的应用程序

利用EclipseADT,您可以导出应用程序的已签署版本。

使用这种方法,ADT提示您输入以下内容:

∙使用现有KeyStore或者创建新的受保护KeyStore所需的信息

∙创建受保护私有密钥所需的信息

∙生成公共密钥证书所需的信息

要导出已签署的应用程序,可以右键单击项目,但是这一次选择菜单项 AndroidTools->ExportSignedApplicationPackage,如图5 所示。

图5.导出已签署的应用程序

 

此时,ExportWizard执行,如 图6 所示。

图6.ExportWizard

 

在 图7 中,选择一个现有的密钥仓库(或者创建一个新的)和证书。

图7.ExportWizard:

密钥仓库选择

 

在 图8 中,输入信息以创建私有密钥和数字证书。

图8.ExportWizard:

创建私有密钥和数字证书

 

在 图9 中,输入目标文件的路径和名称,并验证有效期间。

图9.输入目标文件的路径和名称

 

完成时,您就有了一个发布模式的已签署和已优化的应用程序,您可以发布它。

另外,您也可以使用AndroidManifest工具调用ExportWizard,如 图10 所示。

图10.使用AndroidManifest工具调用ExportWizard

 

应用程序签署之后,下一步由您在manifest中定义应用程序需要的权限。

接下来将描述这一过程。

注意,AndroidDeveloper网站有非常好的关于应用程序签署的文档,当有Android平台的新版本可用时,这些文档都会更新(参见参考资料,了解更多信息)。

回页首

使用权限

权限是一种Android平台安全机制,旨在允许或限制应用程序访问受限的API和资源。

默认情况下,Android应用程序没有被授予权限,这通过不允许它们访问设备上的受保护API或资源,确保了它们的安全。

权限在安装期间通过manifest文件由应用程序请求,由用户授予或不授予。

Android定义长长的一系列manifest权限,以保护系统或其他应用程序的各个方面。

要请求权限,可以在manifest文件中声明一个 属性:

name="string"/>

其中 android:

name 指定权限的名称。

要得到所有Android定义的manifest权限的列表,请参见Manifest.permisson页面。

清单2 是一个manifest文件的例子,它请求使用Internet的权限和写到外部存储器的权限:

清单2.声明(请求)权限

xmlversion="1.0"encoding="utf-8"?

>

android="

android:

versionCode="1"

android:

versionName="1.0"

package="com.cenriqueortiz.tutorials.datastore"

android:

installLocation="auto">

:

:

:

android:

name="android.permission.INTERNET"/>

android:

name="android.permission.WRITE_EXTERNAL_STORAGE"/>

应用程序可以定义它们自己的定制权限,以保护应用程序资源。

其他应用程序想要访问一个应用程序的受保护资源,就必须通过它们自己的manifest文件请求适当的权限。

清单3 展示了一个如何定义权限的例子。

清单3.声明定制权限

xmlns:

android="

android:

name="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"

android:

description="@string/permission_description"

android:

label="@string/permission_label"

android:

protectionLevel="normal"

>

在 清单3 中,通过指定最少的属性,即 name、description、label 和 protectionLevel,定义了一个定制权限。

也可以定义其他属性,但是这里没做介绍。

特别有趣的是 android:

protectionLevel 属性,它表示系统向一个请求权限的应用程序授予(或不授予)给定的权限时应该遵循的方法。

保护级别有普通 和危险。

前者自动授予权限(尽管用户在安装之前总是可以重审),基于签名授予权限(就是说,如果请求权限的应用程序是用同一证书签署的);后者表示权限给予私有数据的访问权,或者具有另一个潜在的负面影响。

有关 manifest属性的更多信息,请参见页面(参见 参考资料)。

应用程序可以限制对应用程序及其使用的系统组件(比如Activity、Service、ContentProvider和BroadcastReceiver)的访问。

通过像 清单4 中那样定义 android:

permission 属性,很容易实现这种限制。

这种级别的保护让应用程序允许或限制其他应用程序访问系统资源。

清单4.定义一个活动的权限

android:

name=".FriendsListActivity"

android:

label="FriendsList">

android:

permission="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"

:

:

回页首

内容提供者和文件权限

内容提供者暴露一个公共URI,用于惟一地识别它们的数据(参见 参考资料)。

要保护此内容提供者,当开始时或者从活动返回结果时,调用者可以设置 Intent.FLAG_GRANT_READ_URI_PERMISSION 和 Intent.FLAG_GRANT_WRITE_URI_PERMISSION,以便授予接收活动权限,以访问特定的数据URI。

应用程序文件默认是受保护的。

文件基于用户ID受保护,因而只对所有者应用程序是可访问的(此应用程序具有相同的用户ID)。

正如前面介绍的,共享相同用户ID(并使用相同数字证书签署)的应用程序运行在相同进程上,因而共享对它们的应用程序的访问。

应用程序可以允许其他应用程序或进程访问它们的文件。

这种允许是通过指定适当的 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE操作模式(以便允许对文件的读或写访问)或 MODE_PRIVATE(以便以私有模式打开文件)而做到的。

您可以在创建或打开文件时利用以下方法指定操作模式:

∙getSharedPreferences(filename,operatingMode)

∙openFileOutput(filename,operatingMode)

∙openOrCreateDatabase(filename,operatingMode,SQLiteDatabase.CursorFactory)

回页首

运行时 Permission API

Android提供各种API来在运行时检查、执行、授予和撤销权限。

这些API是 android.content.Context 类的一部分,这个类提供有关应用程序环境的全局信息。

例如,假设您想要优雅地处理权限,您可以确定您的应用程序是否被授予了访问Internet的权限(参见确定5)。

清单5.使用运行时 Permission API在运行时检查权限

if(context.checkCallingOrSelfPermission(Manifest.permission.INTERNET)

!

=PackageManager.PERMISSION_GRANTED){

//TheApplicationrequirespermissiontoaccessthe

//Internet");

}else{

//OKtoaccesstheInternet

}

要了解其他在运行时检查、执行、授予和撤销权限的权限API,请参考上下文类。

回页首

结束语

本文介绍了Android平台上的安全性,包括沙箱、应用程序签名、应用程序权限,以及文件和内容提供者权限。

阅读完这篇介绍性文章之后,您将能够使用Eclipse手动创建数字证书,请求应用程序权限,以及允许或不允许应用程序访问文件和内容提供者。

此外,您还简要了解了权限运行时API,这些API允许您在运行时检查、执行、授予和撤销权限。

参考资料

学习

∙WhatisAndroid?

在AndroidDevelopers网站阅读此概述性文章。

∙用Eclipse开发Android应用程序(FrankAbleson,developerWorks,2008年2月):

在这篇教程中全面了解开发Android应用程序最容易的方法是使用Eclipse。

∙Android开发简介(FrankAbleson,developerWorks,2009年5月):

获得对Android平台的介绍,并学习如何编写基本的Android应用程序。

∙X.509Certificates:

阅读X.509标准,它定义了哪些信息可以进入证书,并描述了如何将之写下来(数据格式)。

∙扩展的权限:

如果您的应用程序需要访问用户profile的其他部分(可能是私有的),或者需要代表用户将内容发布到Facebook,那么就为它请求扩展的权限。

∙SecuringYourPrivateKey:

在AndroidDevelopers网站上学习如何维护私有密钥的安全性。

∙SigningYourApplications:

从AndroidDevelopers网站上学习,如何在为移动设备用户发布之前签署Android应用程序。

∙Manifest.permission页面:

要查看所有Android定义的Manifest权限列表,请访问AndroidDevelopers网站。

∙ContentProviders:

学习如何存储和检索数据,以及使之对所有应用程序可访问。

∙Context类:

利用这个到AndroidDevelopers网站上描述的全局信息的接口,允许访问特定于应用程序的资源和类。

∙使用Android实现联网(FrankAbleson,developerWorks,2009年6月):

探究Android的联网功能。

∙在Android上使用XML(MichaelGalpin,developerWorks,2009年6月):

了解关于在

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1