您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 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-aliasalias_name-keystorekeystore.name-keyalgRSA-keysize2048-validitynumberofdays注意:清单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-keystorekeystore.namemy_application.apkalias_name在上述代码中,-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导出应用程序的未签署版本,可以右键单击项目并选择AndroidToolsExportUnsignedApplicationPackage(参见图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平台安全机制,旨
本文标题:Android的安全性浅析
链接地址:https://www.777doc.com/doc-3375687 .html