2.指南构成

2.1.开发人员环境

许多关于安全编码的指南包括对有害编码做法的警告及改正建议。虽然这种方法在检查已编码的源代码时很有用,但是对于即将开始编码的开发人员来说,可能反而会让其迷惑不解,因为他们不知道要参考哪一篇文章。

本指南侧重于开发人员所处的工作背景,即“目前开发人员在尝试做什么?”同样,我们也采取了相应的措施来准备与开发人员的工作背景相匹配的文章。例如,我们假定开发人员将参与[创建/使用活动]、[使用 SQLite]等操作,将文章划分为多个项目单元。

我们相信,通过发布支持开发人员工作背景的文章,开发人员将能够轻松找到在项目中即时有用的必备文章。

2.2.示例代码、规则手册、高级主题

每篇文章均由三个章节组成:示例代码、规则手册和高级主题。如果您时间较紧,请直接参阅“示例代码”和“规则手册”章节。内容以某种程度上可重复使用的方式提供。如果以上内容无法解答您的问题,请参阅“高级主题”章节。我们提供的说明有助于找到针对各个案例的解决方案。

除非特别说明,否则我们的开发重点将针对与 Android 4.0.3(API 等级 15)及更高版本有关的平台。由于我们尚未验证与 4.0.3(API 等级 15)以下的 Android 版本相关的任何版本的操作能力,因此所述措施可能在这些旧系统上无效。此外,即使是本指南所关注的版本,在公开发布您的代码之前,也必须在您自己的环境中测试它们来验证其能否正常工作。

对于本文档中提供的示例代码,请将 targetSdkVersion 设置为 API 等级 26 或更高。这用于遵守 Google 指定的以下要求

  • 自 2018 年 8 月起,在 Google Play 商店新发布的应用程序中,targetSdkVersion 必须至少设置为 API 等级 26 (Android 8.0)。
  • 从 2018 年 11 月起,现有应用程序的更新的 targetSdkVersion 至少必须为 API 等级 26。
  • 2019 年起,每年的 targetSdkVersion 级别要求将进一步提高。

2.2.1.示例代码

用作开发人员工作环境中的基本模型以及文章主题的示例代码在“示例代码”章节中发布。如果存在多个模式,我们会为不同模式提供源代码,并对它们进行相应分类。我们一直努力使我们的注释尽可能简单。例如,当我们希望读者注意需要注意的安全问题时,会在文章中列出标有序号的“要点”。我们还会在示例代码注释中插入“***要点(编号)***”,以便与正文中的要点序号对应。请注意,一个要点可以对应多个示例代码段。在整个源代码中,有多个部分尽管内容较少,但需要我们格外注意安全性。为了能够调查需要仔细审视的区域,我们会发布示例代码的整个类单元。

请注意,指南中仅公布了部分示例代码。包含整个示例代码的压缩文件在下面列出的网址中公开。它按照 Apache 许可证版本 2.0 公开;因此,请随意复制并粘贴。请注意,我们已尽可能精简化示例代码中的错误处理代码,以防止其过长。

示例代码中附加的项目/密钥库文件是包含用于 APK 签名的开发人员密钥的密钥库文件。密码为“android”。请在内部示例代码中添加 APK 时使用它。

我们提供了密钥库文件 debug.keystore,用于调试目的。使用 Android Studio 进行开发时,如果为每个项目设置了密钥库,则验证内部示例代码的操作功能非常方便。此外,对于由多个 APK 组成的示例代码,必须匹配每个 AndroidManifest.xml 中包含的 android:debugable 设置,以便验证每个 APK 之间的配合情况。如果从 Android Studio 安装 APK 时未显式设置 android:debugable,则它将自动设为 android:debugable = "true"。

有关将示例代码和密钥库文件嵌入 Android Studio 的信息,请参阅 “2.5.将示例代码安装到 Android Studio 的步骤”。

2.2.2.规则手册

在开发人员工作环境中需要考虑的安全性规则和事项将发布在“规则手册”章节。该章节中处理的规则将在开头以表格格式列出,并分为两个级别:“必需”和“建议”。这些规则将包括两种类型的肯定和否定陈述。例如,表示“某规则是必需的”的肯定声明将显示为“必需”。表示推荐的肯定声明将显示为“推荐”。对于表达规则的必要性质的否定语句,将会说“肯定不会”。对于表示建议的否定语句将说“不推荐”。由于这些级别差异基于作者的主观观点,因此只应将其用作参考。

“示例代码”章节中的示例代码反映了需要考虑的规则和事项,有关这些规则和事项的详细说明,请参阅“规则手册”章节。此外,“规则手册”章节中还介绍了有必要考虑但在“示例代码”章节中未予提及的规则和事项。

2.2.3.高级主题

需要我们注意,但在开发人员环境中的“示例代码”和“规则手册”章节中未涵盖的项目将发布在“高级主题”章节。如果您在阅读“示例代码”或“规则手册”章节后仍有疑问未得到解答,可在“高级主题”章节中探索其解决方法。例如,包含个人意见的主题问题以及与开发人员工作环境相关的 Android 操作系统的限制的主题将在“高级主题”章节介绍。

开发人员总是很忙。开发人员应该具备安全基本知识,并以比较安全的方式尽快开发多个 Android 应用程序,但不一定需要去真正了解深层次的安全问题。但是,有些应用程序从一开始就需要高级别的安全设计和实施。对于此类应用程序的开发人员,他们必须深入了解 Android 操作系统的安全性。

为了使强调开发速度的开发人员以及强调安全性的开发人员都受益,本指南的所有文章都分为“示例代码”、“规则手册”和“高级主题”三个章节。“示例代码”和“规则手册”章节的目的是提供任何人都可以从中受益,有关安全性的概括性说明,以及需要最少量的自定义操作的源代码,这些源代码只需通过复制和粘贴操作即可使用。在“高级主题”章节中,我们提供的材料将帮助开发人员在遇到特定问题时以特定方式思考。“高级主题”章节旨在帮助开发人员在参与构建单个应用程序时审视最佳安全设计和编码。

2.3.指南的适用范围

本指南的目的是汇总一般 Android 应用程序开发人员所需的安全最佳做法。因此,我们的讲述范围主要集中在开发要在公共市场中分发的 Android 应用程序时适用的安全提示(下图中的“应用程序安全”部分)方面。

_images/image5.png

图 2.3.1 Android 平台的主要组件

关于上图中“设备安全”内的组件实施安全性超出了本指南的讨论范围。用户安装的一般应用程序与设备制造商预安装的应用程序之间的安全性存在差异。本指南只考虑前者,不讨论后者。在当前版本中,仅发布有关 Java 实施的提示,但在未来版本中,我们还计划发布有关 JNI 实施的提示。

此外,到目前为止,我们不讨论攻击者获取 root 权限所导致的威胁。我们在讨论中秉承此前提假设:Android 设备安全,无法获得其 root 权限,并且以 Android 操作系统安全模式为依据提出安全建议。对于资产和威胁的处理,我们在“ 3.1.3 资产分类和保护对策”中提供了详细描述。

2.4.关于 Android 安全编码的文献

由于我们不能在指南中讨论所有 Android 的安全编码事宜,我们建议您阅读下面提及的文献以及指南。

2.5.将示例代码安装到 Android Studio 的步骤

本节介绍如何将示例代码安装到 Android Studio 中。示例代码根据用途划分为多个项目。有关安装示例代码的说明,请参阅“2.5.1.安装示例项目”。安装完成后,请参阅“2.5.2.设置 debug.keystore 以运行和测试示例代码”,并将 debug.keystore 文件安装到 Android Studio 中。我们已在下列环境中验证了以下步骤:

  • 操作系统
    • Windows 10 专业版
  • Android Studio
    • 3.1.4
  • Android SDK
    • Android 9.0 (API 28)
      • 除非另有说明,否则可通过 Android 9.0 (API 28) 构建示例项目。

2.5.1.安装示例项目

2.5.1.1.下载示例代码

从“2.2.1 示例代码”中所示的网址获取示例代码。

2.5.1.2.提取示例代码

右键单击压缩为 zip 文件的示例代码,然后单击“提取全部”,如下所示。

_images/image6.png

图 2.5.1 提取示例代码

2.5.1.3.指定部署位置。

通过指定“C:\”,然后单击“提取”按钮,在名为“C:\android_secudencing”的路径下创建一个工作区。

_images/image7.png

图 2.5.2 指定部署位置

单击“提取”按钮后,将在“C:”下方创建一个名为“android_secudening”的文件夹。

_images/image8.png

图 2.5.3“android_secudeconding”文件夹

示例代码包含在“android_secudencing”文件夹中。

例如,当您要引用“4.1.创建/使用活动”中的“4.1.1.3.创建/使用合作伙伴活动”内的示例代码时,请查看以下内容。

android_securecoding
    ┗ Create Use Activity
        ┗ Activity PartnerActivity

采用这种方法时,示例代码项目将位于“android_secudec”文件夹中的章节标题下。

2.5.1.4.通过启动 Android Studio 来指定区

从开始菜单或桌面图标启动 Android Studio。

_images/image9.png

图 2.5.4 启动 Android Studio

启动后,从出现的对话框中打开项目。

_images/image10.png

图 2.5.5 Android Studio 对话框

如果您已经打开了一个项目,则会显示该窗口,然后通过从菜单中选择“文件 -> 关闭项目”来关闭显示的项目。

_images/image11.png

图 2.5.6 文件 -> 关闭项目

2.5.1.5.打开现有的 Android Studio 项目

从显示的对话框中单击“打开现有的 Android Studio 项目”。

_images/image10.png

图 2.5.7 打开项目

2.5.1.6.选择项目

选择您想要打开的项目。

_images/image13.png

图 2.5.8 选择项目

如果您在 Android Studio 中使用的 Gradle 版本与本指南中的示例代码项目所采用的版本不同,则应优化 Gradle。

_images/image14.png

图 2.5.9 优化 Android Gradle

按照屏幕上的说明,单击“更新”以启动 Android Gradle 插件的更新。

_images/image15.png

图 2.5.10 更新 Android Gradle 插件

将显示以下消息。单击“修复 Gradle 包装器并重新导入项目 Gradle 设置”以更新 Gradle 包装器。

_images/image16.png

图 2.5.11 更新 Gradle 包装器

2.5.1.7.结束打开

自动打开项目。

_images/image17.png

图 2.5.12 结束打开

Android Studio 与 Eclipse 不同,将在窗口中显示单个项目。如果要打开其他项目,请单击“文件 -> 打开 ...”。

_images/image18.png

图 2.5.13 “文件” -> “打开”…

2.5.2.设置 debug.keystore 以运行和测试示例代码

需要签名才能在 Android 设备或仿真器上激活示例代码生成的应用程序。将用于签名的调试密钥文件“debug.keystore”安装到 Android Studio 中。

2.5.2.1.单击“文件”->“项目结构...”

_images/image19.png

图 2.5.14 “文件” -> “项目结构…”

2.5.2.2.添加签名

从左窗格的“模块”列表中选择一个项目,选择“签名”选项卡,单击“+”按钮,然后将默认名称“config”更改为“debug”。

_images/image20.png

图 2.5.15 添加签名

2.5.2.3.选择“debug.keystore”作为存储文件

单击图 2.5.15 上红色圆圈里的按钮,并设置“存储文件”。Debug.keystore 包含在示例代码中(在 android_securecoding 文件夹下)

_images/image21.png

图 2.5.16 选择“debug.keystore”

_images/image22.png

图 2.5.17 选择“debug.keystore”的结果

2.5.2.4.设置签名配置

选择“构建类型”选项卡,选择上一步中键入的签名名称,然后单击“确定”。

_images/image23.png

图 2.5.18 设置签名配置

2.5.2.5.确认 build.gradle 文件

您选择的 debug.keystore 文件的路径显示在 signingConfigs 中,signingConfig 将显示在 buildTypes 的 debug 部分中。

_images/image24.png

图 2.5.19 确认 build.gradle 文件