首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

懂得Android 上的安全性

2012-06-30 
理解Android 上的安全性理解 Android 上的安全性利用沙箱、应用程序签名和权限增强应用程序安全性?转:http:

理解Android 上的安全性
理解 Android 上的安全性

利用沙箱、应用程序签名和权限增强应用程序安全性

?

转:http://www.ibm.com/developerworks/cn/xml/x-androidsecurity/

?

?

用户 ID:Linux 与 Android

?

不同的应用程序可以运行在相同的进程中。对于此方法,首先必须使用相同的私钥签署这些应用程序,然后必须使用 manifest 文件给它们分配相同的 Linux 用户 ID,这通过用相同的值/名定义 manifest 属性 android:sharedUserId 来做到。

?

应用程序或代码签名是这样一个过程,即生成私有、公共密钥和公共密钥证书,签署和优化应用程序。 权限是 Android 平台的一种安全机制,以允许或限制应用程序访问受限的 API 和资源。默认情况下,Android 应用程序没有被授予任何权限,不允许它们访问设备上受保护的 API 或资源,从而保证了它们的安全。权限必须被请求,定义了定制的权限,文件和内容提供者就可以受到保护。确保在运行时检查、执行、授予和撤销权限。

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

?

keytool -genkey -v -alias <alias_name> -keystore <keystore.name> -keyalg RSA -keysize 2048 -validity <number of days>

?

?

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

在 清单 1 中,-genkey 表示一个公共、私有密钥对项,以及一个 X.509 v1 自签署的单个元素证书链,其中包含生成的公共密钥。-v 表示冗长模式。-alias 是用于 keystore 项的别名,keystore 存储生成的私有密钥和证书。-keystore 表示使用的密钥仓库的名称。-keyalg 是用来生成密钥对的算法。-keysize 是生成的密钥大小,其中默认大小是 1024,但是推荐大小是 2048。-validity 是有效天数;推荐采用大于 1000 的值。

注意:生成密钥之后,一定要保证密钥的安全。不要共享私有密钥,也不要在命令行或脚本中指定密钥;注意,keytool 和 jarsigner 会提示输入密码。关于这一技巧和其他技巧,请参考 Android Developers 网站的 “Securing Your Private Key”(参见 参考资料 中的链接)。

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

对于有效期,请确保使用超出应用程序本身和相关应用程序预期生命期的时期。如果您是在 Android Market 上发布应用程序,那么有效期必须晚于 2033 年 10 月 22 日结束;否则不能上载。此外,拥有长寿命的证书让升级应用程序更为容易。幸运的是,Android Market 强制采用长寿命的证书,以帮助您避免此类问题。

?

jarsigner -verbose -keystore <keystore.name> <my_application.apk> <alias_name>

?在上述代码中,-verbose 表示冗长模式,-keystore 表示使用的密钥仓库的名称。接下来是应用程序的名称 (.apk),最后是用于私有密钥的别名。

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

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

?

zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

?

在前面的代码中,-v 表示冗长输出。数字 4 表示使用四字节对齐(总是使用四字节)。下一个参数是输入已签署应用程序的文件名 (.apk),它必须用您的私有密钥签署。最后一个参数是输出文件名;如果覆盖现有应用程序,则添加一个 -f

?

jarsigner -verify -verbose -certs my_application.apk

?

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

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

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

?

选中之后,ADT 提示您选择将未签署应用程序导出到的目录。记住,一旦应用程序被导出,您就必须手动签署和优化应用程序,跟前面介绍的那样。

?

?

此时,Export Wizard 执行,如 图 6 所示。


图 6. Export Wizard

懂得Android 上的安全性

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


图 7. Export Wizard:密钥仓库选择

懂得Android 上的安全性

?

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


图 8. Export Wizard:创建私有密钥和数字证书
懂得Android 上的安全性

?

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


图 9. 输入目标文件的路径和名称
懂得Android 上的安全性

?

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

另外,您也可以使用 Android Manifest 工具调用 Export Wizard,如 图 10 所示。


图 10. 使用 Android Manifest 工具调用 Export Wizard

懂得Android 上的安全性

应用程序签署之后,下一步由您在 manifest 中定义应用程序需要的权限。接下来将描述这一过程。

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

?

?

<uses-permission android:name="string" />

?其中 android:name 指定权限的名称。

要得到所有 Android 定义的 manifest 权限的列表,请参见 Manifest.permisson 页面。清单 2 是一个 manifest 文件的例子,它请求使用 Internet 的权限和写到外部存储器的权限:


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

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      android:versionCode="1"      android:versionName="1.0"      package="com.cenriqueortiz.tutorials.datastore"       android:installLocation="auto">    <application         :        :        :    </application>    <uses-permission         android:name="android.permission.INTERNET"/>    <uses-permission         android:name="android.permission.WRITE_EXTERNAL_STORAGE"/></manifest> 

?

应用程序可以定义它们自己的定制权限,以保护应用程序资源。其他应用程序想要访问一个应用程序的受保护资源,就必须通过它们自己的 manifest 文件请求适当的权限。清单 3 展示了一个如何定义权限的例子。


清单 3. 声明定制权限

<permission        xmlns:android="http://schemas.android.com/apk/res/android"        android:name="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"        android:description="@string/permission_description"        android:label="@string/permission_label"        android:protectionLevel="normal"    ></permission>

?

?

在 清单 3 中,通过指定最少的属性,即 namedescriptionlabelprotectionLevel,定义了一个定制权限。也可以定义其他属性,但是这里没做介绍。

特别有趣的是 android:protectionLevel 属性,它表示系统向一个请求权限的应用程序授予(或不授予)给定的权限时应该遵循的方法。保护级别有普通危险。前者自动授予权限(尽管用户在安装之前总是可以重审),基于签名授予权限(就是说,如果请求权限的应用程序是用同一证书签署的);后者表示权限给予私有数据的访问权,或者具有另一个潜在的负面影响。有关 <permission> manifest 属性的更多信息,请参见 <permission> 页面(参见 参考资料)。

应用程序可以限制对应用程序及其使用的系统组件(比如 Activity、Service、Content Provider 和 Broadcast Receiver)的访问。通过像 清单 4 中那样定义 android:permission 属性,很容易实现这种限制。这种级别的保护让应用程序允许或限制其他应用程序访问系统资源。


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

<activity     android:name=".FriendsListActivity"     android:label="Friends List">    android:permission="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"    <intent-filter>        :        :    </intent-filter>        </activity>  

?

?

内容提供者和文件权限

内容提供者暴露一个公共 URI,用于惟一地识别它们的数据(参见 参考资料)。要保护此内容提供者,当开始时或者从活动返回结果时,调用者可以设置 Intent.FLAG_GRANT_READ_URI_PERMISSIONIntent.FLAG_GRANT_WRITE_URI_PERMISSION,以便授予接收活动权限,以访问特定的数据 URI。

应用程序文件默认是受保护的。文件基于用户 ID 受保护,因而只对所有者应用程序是可访问的(此应用程序具有相同的用户 ID)。正如前面介绍的,共享相同用户 ID(并使用相同数字证书签署)的应用程序运行在相同进程上,因而共享对它们的应用程序的访问。

应用程序可以允许其他应用程序或进程访问它们的文件。这种允许是通过指定适当的 MODE_WORLD_READABLEMODE_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) {            // The Application requires permission to access the              // Internet");} else {    // OK to access the Internet}

?

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

?

结束语

本文介绍了 Android 平台上的安全性,包括沙箱、应用程序签名、应用程序权限,以及文件和内容提供者权限。阅读完这篇介绍性文章之后,您将能够使用 Eclipse 手动创建数字证书,请求应用程序权限,以及允许或不允许应用程序访问文件和内容提供者。此外,您还简要了解了权限运行时 API,这些 API 允许您在运行时检查、执行、授予和撤销权限。

热点排行