Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Google Cloud 密钥保险柜服务

我们所说的云服务使用安全硬件来存储加密密钥,这样对密钥的访问就能受到低熵知识因素(例如锁屏 PIN 码)的保护。安全硬件设计为在尝试提供正确知识因素的失败次数过多时使存储的加密密钥永久性无法检索,从而防止暴力破解。

作者:Shabsi Walfish
版本日期:2018 年 3 月 6 日

注:本文档尚未完成,实现细节仍在进行最终确定。在系统稳定并且可以制作更多文档时,我们将为本白皮书更新更多详情(尤其是与相关开放源代码版本有关的内容)。

概览

长久以来,加密(用于确保数据隐私性)需要使用在攻击者看来具有高熵的密钥。需要具备高熵是因为,加密架构必须抵御暴力破解,后者会探索包含所有可能密钥的空间,直至找到正确的密钥。考虑到现今可以达到的计算能力,对加密密钥合理的最低熵要求可能约为 70-80 位。遗憾的是,对人类而言,记忆并可靠地回忆起熵如此高的密码或其他密钥非常困难1,特别是很少使用的密码(但经常使用高熵密码是件困难并且繁重的工作)。这给我们留下了一个难题:如果我们希望密钥成为用户很容易记忆的“知识因素”,如何才能利用加密技术保护私有数据呢?出于各种原因,这个问题极难解决,因此云存储服务通常仅使用由云存储提供商自身管理的密钥对数据加密,而不是靠用户记忆自己的密钥。

一种弥合对加密密钥的要求与人类可记忆密钥之间差距的方法是,使用云密钥保险柜 (CKV) 服务来存储高熵“恢复密钥”,后者由低熵人类可记忆密钥进行保护。CKV 服务只会将恢复密钥发放给可证明其知晓的人类可记忆密钥正确无误的一方。CKV 服务可通过对证明知晓密钥的尝试失败次数施加绝对限制来挫败针对人类可记忆密钥的暴力破解。恢复密钥本身是一个标准的对称加密密钥,适合与可轻松加密大量能安全地存储在任何位置的数据(例如磁盘备份)的(经验证)加密架构配合使用 – 这些已加密数据对无法获得恢复密钥的人毫无用处。

本白皮书介绍我们利用可信硬件模块 (THM) 构建云密钥保险柜服务的方法。我们 CKV 服务的第一个实现旨在通过用户的锁定屏幕知识因素 (LSKF) - PIN 码密钥、密码或用于解锁智能手机的滑动图案 – 保护恢复密钥。人类能够可靠地记忆其 LSKF。同时,此类 LSKF 密钥的熵刚好足以抵御尝试次数非常有限的攻击者,因此很适合 CKV 服务。

我们的云密钥保险柜服务的第一个应用是启用客户端加密 Android 备份。以前,在 Android 设备上本地加密的文件使用的密钥通过用户的锁定屏幕知识因素进行保护,但锁定屏幕并不能保护这些文件在云端存储(并加密)的备份。云密钥保险柜首次实现了同时对存储在云端的 Android 备份进行锁定屏幕保护。这意味着,Google 的服务器无法访问或恢复已加密备份的内容 – 只有包含用户 LSKF 的设备才能将备份解密。

核心概念

首先,支持云密钥保险柜服务的客户端平台只有即将推出的 Android P 操作系统,我们在本白皮书通篇提到的客户端均指运行 Android P 操作系统(带 Google 移动服务)的设备。我们的服务器端实现运行在特别指定的 Google 服务器上,这些服务器安装了额外的 Titan 芯片2 。Google 设计的 Titan 芯片充当我们的可信硬件模块中的硬件组件,并且我们为其特别配置了自定义引导加载程序和实现我们的协议和安全执行机制(如本白皮书所述)的固件。我们利用硬件验证技术来确保我们的协议确实运行在 Titan 硬件上。

CKV 服务必须能够扩展规模以处理数以十亿计3 Android 设备的流量,并且不能因硬件故障(例如芯片烧坏)而大量丢失任何用户数据,或者因数据中心维护而遭遇任何长时间中断。因此,安装有 Titan 芯片的服务器组织成了同类群组,每个同类群组都由若干独立 THM 组成,其中每个模块都包含同一密钥材料的副本。给定同类群组将分发到不同维护地区的物理异构数据中心,以确保系统可以达到其可用性和可靠性目标。在可伸缩性方面,客户端将分片给若干不同的同类群组,这样我们只需添加更多服务器来增加可用同类群组数量,便可调整服务的容量。

我们现在随时可以枚举云密钥保险柜服务架构的主要组件。

架构组件/术语表

锁定屏幕知识因素 (LSKF):一种人类可记忆密钥,例如短 PIN 码、3 x 3 点状网格上的滑动图案或密码。该密钥用于保护本地解锁设备的功能,被视为用户本地设备屏幕锁定的主要(或“强”)身份验证因素。

客户端:一种运行 Android P 操作系统和 Google 移动服务或同等支持的软件的最终用户设备。

Android 框架层:我们利用这个通用术语指称下一版本 Android 操作系统(Oreo 版本的继任者,截至本文撰写时尚未命名)或更新版本中的 API,并非旨在指称任何早前版本

Google 移动服务:一系列运行在最终用户设备上、令其能够使用 Google 的帐号系统和自定义服务器 API 的服务和应用。

恢复代理:一种作为 Google Play 服务的一部分在 Android P 设备(或类似设备)的用户空间中运行的系统应用。恢复代理负责执行客户端的各种协议,以及根据需要与 Android 操作系统连接,以生成任何涉及 LSKF 的协议消息。

恢复权利:当用户想检索恢复密钥时,他们必须创建恢复权利,后者具有用户声称知晓的 LSKF 的已加密副本。通常要求用户在尝试访问旧设备恢复密钥的新设备上输入其旧设备的 LSKF。

恢复密钥:一种受云密钥保险柜服务保护、用于对客户端设备上的数据进行加密(并进行身份验证)的加密密钥。恢复密钥放入保险柜后(见下文),在客户端使用它完成对数据的加密时,可立即删除其本地副本。

云密钥保险柜 (CKV) 服务:一种让客户端设备能够存储受人类可记忆 LSKF 保护的加密密钥的互联网服务。

同类群组:一系列可充当彼此冗余副本的保险柜服务器/THM。

同类群组公钥:由特定 THM 同类群组生成的密钥对中的公钥。对应的私钥仅在密钥生成时位于同类群组内的 THM 中提供。

可信硬件模块 (THM):一种设计用于提供最小可信计算环境的专用安全模块(微型控制器)。安全元件必须至少能够生成和/或存储密钥,以及保持某种非易失性进化状态(以便它能预防涉及重置为某个早前状态的攻击)。

保险柜:CKV 服务的数据库内某个包含单一设备 LSKF 受保护恢复密钥的条目。一个最终用户可能有多个记录在案的保险柜,每个保险柜都对应不同的设备或 LSKF。只有保险柜服务器中的 THM 可以检查或提取保险柜的内容。

保险柜服务器:一种运行在 Google 数据中心内、经特别改造后添加了可信硬件模块 (THM) 的通用机器

协议设计

CKV 协议由若干阶段组成,如下所述:

初始化

为初始化系统,Google 将提供一个“可信根”公钥,Android 框架层将利用这个公钥来验证 Google 的硬件认证。这个可信根的签名密钥离线存储并进行了精心保护,需要多名员工共同参与,才能使用它进行签署。这个可信根的公钥已并入 Android 操作系统,只能通过操作系统更新进行更改。

Google 还会定期发布每个 THM 同类群组的公钥列表以及对该列表的认证。对该列表的认证使用的签名链回到可信根。每次对已发布列表的更新还包含一个序列号,以便能够防止回滚。恢复代理将获取最近发布的同类群组公钥列表,并将其提供给 Android 框架层。然后 Android 框架层对认证进行验证,并从列表中随机选择一个同类群组公钥,供在保险柜创建阶段中使用。

保险柜创建

通过获取同类群组公钥列表帮助框架完成初始化后,恢复代理将请求 Android 框架层新建保险柜。只要用户接下来输入了 LSKF,框架就会生成新的恢复密钥,并先用衍生自 LSKF 哈希值的密钥对其加密,再用框架在初始化期间选择的同类群组公钥进行加密。生成的已加密 blob 是框架回传给恢复代理的保险柜,然后由恢复代理上传至 Google 的 CKV 服务。

保险柜打开

当新设备上的恢复代理需要获得对恢复密钥的访问权,而该密钥存储在某个保险柜中时,它会先提示用户输入创建保险柜的原始设备的 LSKF。然后恢复代理将请求框架利用该 LSKF 创建一个恢复权利。框架将生成一个新的权利人密钥,并使用保险柜最初加密时使用的同一同类群组公钥对该权利人密钥以及认领的 LSKF 的哈希值进行加密。生成的已加密 blob 称作恢复权利,框架会将它传递给恢复代理,然后由恢复代理将其提交给 CKV 服务。

CKV 会将恢复权利(及其对应的保险柜)发送给作为正确同类群组一部分的保险柜服务器。这些保险柜服务器中的 THM 随即对恢复权利解密,并尝试利用认领的 LSKF 哈希值从原始保险柜中提取恢复密钥(以获得内部加密密钥)。如果原始 LSKF 哈希值与认领的 LSKF 哈希值匹配,THM 将从保险柜提取恢复密钥,然后用恢复权利中的权利人密钥重新加密。否则,THM 将触碰失败尝试计数器。失败尝试计数器达到其限值时,THM 将拒绝处理该保险柜的任何后续恢复权利

最后,如果一切顺利,重新加密的恢复密钥(现已使用权利人密钥加密)将从保险柜服务器一路回传至框架。框架利用其权利人密钥副本对恢复密钥解密,协议至此完成。

安全措施

云密钥保险柜系统旨在通过在堆叠的多个级别加入安全保护提供“深度防御”。为了解这些保护的工作方式,我们将先介绍客户端安全措施,然后沿堆叠向上介绍各级别的安全措施,最后介绍云密钥保险柜服务的安全措施。

客户端安全性

根据具体的原始设备制造商 (OEM) 和设备,正常情况下系统利用各种因 OEM 而异的方法在设备上存储和保护锁定屏幕知识因素 (LSKF)。例如,Google 的 Pixel 2 设备闲时利用防篡改硬件安全模块来存储 LSKF,并对 LSKF 验证施加基于硬件的使用率限制。为支持使用云密钥保险柜而推出的新框架 API 设计为尽最大可能保留现有的安全保证措施,哪怕设备只是利用这种硬件安全模块来保护 LSKF 的存储。

我们将在这一部分侧重于专门介绍对云密钥保险柜新功能有影响的相关安全性问题和保护措施,而不会试图全面介绍所有与 LSKF 有关的安全机制。

保护框架 API

为支持 CKV 服务而新增的框架 API 标记为 @SystemApi 并需要特殊权限,这确保了它们只能供 Google Play 服务等原始设备制造商 (OEM) 批准的系统应用使用。这在很大程度上避免了可能向用户在设备上安装的应用暴露的任何直接攻击面。

框架 API 还确保只为经过可信根认证的同类群组公钥创建保险柜。可信根在交付时已由原始设备制造商 (OEM) 并入框架内,无法通过操作系统更新以外的其他途径进行更改。这就确保了 LSKF 只能用于创建将充分施加基于硬件的暴力破解保护的保险柜。我们通过依靠云密钥保险柜服务中的 THM 为 LSKF 提供暴力破解保护所达到的安全性可与出于同一目的在设备上使用安全硬件(正如 Google Pixel 2 设备的做法)的效果相媲美。

由于我们不会假定 LSKF 将存储在设备上安全硬件以外的任何位置,因此只能在设备解锁后立即创建新的保险柜。在用户输入 LSKF 以解锁设备时,LSKF 会短时间提供给内存中的框架使用。用于创建保险柜的新 API 正是在这一时刻对它加以利用。无法在设备锁定时新建受 LSKF 保护的保险柜,因为 LSKF 不可用。

保护恢复代理

我们在恢复代理一级提供的主要安全保护是,协议旨在防止恢复代理看到当前设备的 LSKF 或任何恢复密钥。在客户端,只有框架才能查看这些内容,这大幅度增加了对恢复代理中任何潜在错误或安全漏洞加以利用的难度。恢复代理主要用于管理生命周期事件以及在云端与框架之间来回传递数据。它的唯一例外情况发生在保险柜打开协议之前的恢复期间,用户在该情况下必须输入旧设备的 LSKF – 恢复代理中实现了为旧设备收集认领 LSKF 的界面4。不过,框架接管恢复权利的创建后,恢复代理实现会立即“忘记”认领的 LSKF。

协议的安全功能

尽管全面分析协议超出了本文档的范围,但我们还是想重点说明协议中内置的几项保护措施。具体地讲,协议在整个过程中只使用 LSKF 的哈希值。这意味着,如果 LSKF 具有高熵(例如,如果它是一个有效的高熵密码),则存储保险柜确实好于存储密码哈希值,并且在这种情况下,密码哈希值可提供不依赖 THM 安全性的安全措施。因此,我们将对 LSKF“难记”哈希的负载处理作为协议的一部分加以支持。我们还以加密方式将保险柜绑定到创建它的设备的标识符,并将恢复权利绑定到保险柜打开协议期间作为质询使用的随机数,以确保恢复权利的新鲜度。

由于恢复密钥是每次创建保险柜时新生成的,因此通过使用新创建的保险柜覆盖现有保险柜条目来实现密钥轮转。保险柜使用的失败尝试计数器地址在保险柜创建期间进行选择,并且 Android 框架层会确保用于任何后续保险柜的计数器地址不会发生变化,除非 LSKF 已更改,或出现新的已认证同类群组公钥列表。因此,恢复密钥的轮转可在不损害 LSKF 暴力破解防护的情况下完成。

云密钥保险柜服务的服务器安全性

服务器是使用运行在普通服务器硬件上的软件组合和运行在专用硬件(Titan 芯片)上的固件实现的。我们将介绍每一层提供的保护措施。

硬件保护

在 CKV 服务服务器端实现的主要安全保护是利用 Google 自有的自定义设计 Titan 芯片搭建的可信硬件模块 (THM)。这些芯片运行的固件会公开必要的 API 以实现 CKV 协议。具体地讲,它们可以生成并与其同类群组的其他成员安全地共用密钥对,使得固件逻辑能够防止私钥泄漏到同类群组中的 Titan 芯片之外。他们还可以执行保险柜打开操作,并以保险柜为单位保留严格递增的失败尝试计数器(计数器由 Titan 芯片内存储的状态提供支持)。本文档未来发布的版本将对 CKV Titan 芯片固件执行的协议做更详细的说明。

考虑到服务器安全性源自 Titan 芯片中的固件逻辑,我们必须确保该逻辑发生的变化不会使芯片泄漏密钥或无视计数器限值。为实现此目标,我们还改动了 Titan 的启动加载器,以确保在应用任何更新之前芯片内存储的数据(例如同类群组的私钥)已完全擦除。这种保护的缺点是,我们无法在不损失一些数据的情况下修补固件中的错误——更新固件在功能上等同于销毁现有硬件,并将其更换为新的芯片。如果需要关键固件补丁程序,Google 需要制作并发布一个全新的已认证同类群组公钥列表,并将所有用户逐步迁移到新列表上。为减轻这一风险,我们会尽量让固件的基准代码保持在相当小的规模,并仔细核查其中有无任何潜在安全问题。

软件保护

除了 THM 以保险柜为单位施加的硬性故障限制外,CKV 服务还会实现基于软件的使用率限制。使用率限制旨在防止黑客进入用户的帐号并快速耗尽其恢复尝试失败次数限值,从而起到封锁真实用户对其恢复密钥访问权的作用。CKV 服务会在后续每一次失败的保险柜打开请求后强制执行延时增加,这与用户设备在解锁屏幕尝试失败次数过多时施加的延时类似。

我们还会为托管用户时间的云服务实现标准安全措施,包括严格访问控制、监控和审核。

详细协议规范

详细协议规范仍在制定中,本文档将进行更新以加入这些详细信息,以及公布今年晚些时候 Android 开源项目中的客户端代码。

注释

  1. “向着在人类记忆中可靠存储 56 位密钥的目标前进 | USENIX”。2014 年 8 月 1 日,https://www.usenix.org/node/184458。  
  2. “Google Cloud Platform 博客:Titan 深入探索:明文中的安全性”。2017 年 8 月 24 日,https://cloudplatform.googleblog.com/2017/08/Titan-in-depth-security-in-plaintext.html。  
  3. “Google 宣布每月 Android 设备激活量超过 20 亿台....”2017 年 5 月 17 日,https://www.theverge.com/2017/5/17/15654454/android-reaches-2-billion-monthly-active-users。 
  4. 这样我们就可以提供灵活的界面来输入其他设备的 LSKF——当前设备的框架可能没有合适的界面用来输入旧设备的 LSKF。