Google Cloud 密钥保险柜服务

我们介绍了一种云服务,该服务使用安全硬件存储加密密钥,以便通过低熵知识因素(例如锁屏 PIN 码)来保护对密钥的访问。安全硬件旨在防止暴力破解攻击,即在提供正确验证因数的尝试失败次数过多后,存储的加密密钥将永久无法检索。

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

注意:本文档仍在编写中,实现细节仍在最终确定。随着系统稳定且可以生成更多文档,我们将更新本白皮书,提供更详细的信息(尤其是与相关的开源版本结合使用)。

概览

传统上,加密(用于确保数据隐私)需要使用在攻击者看来具有高熵的密钥。之所以需要高熵,是因为加密架构必须抵御暴力破解攻击,这些攻击会探索所有可能的 Secret 的空间,直到找到正确的 Secret。鉴于当今的计算能力,对加密密钥的合理最小熵要求可能约为 70 位到 80 位。遗憾的是,人们发现很难记住和可靠地记住具有如此多的熵的密码1,尤其是在极少使用的情况下(但频繁使用高熵密码既困难又麻烦)。这给我们带来了一个具有挑战性的问题:如果我们想让密钥成为用户极有可能记住的“知识因素”,该如何使用加密技术保护私密数据?由于各种原因,此问题非常难以解决,以至于 Cloud Storage 服务通常仅使用由 Cloud Storage 提供程序本身管理的 Secret 来加密数据,而不是依赖于用户记住自己的 Secret。

如需缩小加密密钥和人类可记忆密钥之间的差距,一种方法是使用云密钥保险柜 (CKV) 服务来存储由低熵人类可记忆密钥保护的高熵“恢复密钥”。CKV 服务只会将恢复密钥释放给能够证明自己知道正确的人类可记忆密钥的一方。CKV 服务可以阻止针对人类可记忆密钥的暴力破解攻击,该服务会对证明知道密钥的失败尝试次数实施绝对限制。恢复密钥本身是一个标准的对称加密密钥,适合与(经过身份验证的)加密架构搭配使用,这种架构可以轻松加密可安全存储在任何位置的大量数据(例如磁盘备份),但此类加密数据对于任何无法获得恢复密钥的人来说都是毫无用处的。

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

我们的云密钥保管库服务的第一个应用是启用客户端加密 Android 备份。以前,在 Android 设备上本地加密的文件使用的密钥通过用户的 LSKF 进行保护,但存储在云端(和加密)的这些文件的备份不受 LSKF 保护。云密钥保险柜首次还为存储在云端的 Android 备份提供了锁定屏幕保护功能。这意味着 Google 的服务器无法访问或恢复加密备份的内容,只有具有用户 LSKF 的设备才能解密备份。

核心概念

最初,云密钥保险柜服务唯一支持的客户端平台是 Android 9 Pie 操作系统,而本白皮书中提到的客户端指的是搭载 Android 9 Pie 操作系统且带有 Google Play 服务的设备。我们的服务器端实现在专门指定的 Google 服务器上运行,这些服务器上安装了额外的 Titan 芯片2。Google 设计的 Titan 芯片充当我们可信硬件模块中的硬件组件,我们为其特别配置自定义引导加载程序和固件,以实现我们的协议和安全强制执行机制(如本文所述)。我们使用硬件认证技术来保证我们的协议确实在 Titan 硬件上运行。

CKV 服务必须能够扩容以处理来自数十亿3 Android 设备的流量,而不会由于硬件故障(例如芯片烧坏)而丢失任何大量用户数据,也不会因数据中心维护而出现任何长时间的中断。因此,安装有 Titan 芯片的服务器被整理成同类群组,每个同类群组由几个独立的 THM 组成,每个 THM 都包含相同密钥材料的副本。给定同类群组将分布到不同维护可用区中物理异构的数据中心内,以确保系统能够实现其可用性和可靠性目标。为实现可伸缩性,客户端将分成许多不同的同类群组,这样我们只需添加更多服务器,即可调整服务的容量,从而增加可用同类群组的数量。

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

架构组件/术语表

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

客户端:搭载 Android 9 Pie 操作系统和 Google Play 服务或同等支持的软件的最终用户设备。

Android 框架:我们使用此通用术语(或简称“框架”)来指代 Android 9 Pie 或更高版本中的 API,而不是指任何早期版本。

Google Play 服务:在最终用户设备上运行的一系列服务和应用。借助这些服务和应用,最终用户设备能够与 Google 的帐号系统和自定义服务器 API 配合使用。

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

恢复声明:当用户希望检索恢复密钥时,必须创建恢复声明,该声明具有用户声明知道的 LSKF 的加密副本。通常,系统会在用户尝试访问旧设备恢复密钥的新设备上输入其旧设备的 LSKF。

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

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

同类群组:能够充当彼此冗余副本的保险柜服务器/THM 的集合。

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

可信硬件模块 (THM):一种专用安全模块(微控制器),旨在提供极简且值得信赖的计算环境。安全元件必须至少能够生成和/或存储密钥,并维持某种非易失性演变状态(以便能够防止涉及重置为先前状态的攻击)。

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

保险柜服务器:在 Google 数据中心内运行的通用机器,该机器经过专门改造,可添加可信硬件模块 (THM)。

协议设计

CKV 协议包含几个阶段,如下所示:

初始化

为了初始化系统,Google 将为框架提供用于验证 Google 硬件认证的“信任根”的公钥。此信任根的签名密钥离线存储并受到妥善保护,需要多名员工的参与才能使用它进行签名。此信任根的公钥已嵌入到 Android 操作系统中,只能通过操作系统更新进行更改。

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

保险柜创建

通过获取同类群组公钥列表帮助框架完成初始化后,恢复代理将请求框架创建一个新的保险柜。每当用户下一次输入 LSKF 时,框架都会生成新的恢复密钥,并首先使用派生自 LSKF 的哈希值的密钥对其进行加密,然后使用框架在初始化期间选择的同类群组公钥进行加密。生成的加密 blob 是框架回传给恢复代理的保险柜,恢复代理随后会将其上传到 Google 的 CKV 服务。

保险柜打开

当新设备上的恢复代理需要获取对存储在特定保险柜中的恢复密钥的访问权限时,它会首先提示用户输入创建保险柜的原始设备的 LSKF。然后,恢复代理会要求框架使用该 LSKF 创建恢复声明。框架将生成一个新的版权主张方密钥,并使用保险柜最初加密时所用的同类群组公钥来加密该版权主张方密钥以及已声明所有权的 LSKF 的哈希值。生成的加密 blob 称为恢复声明,框架会将其传递给恢复代理,然后由恢复代理将其提交给 CKV 服务。

CKV 会将恢复声明(及其相应的保险柜)路由到属于正确同类群组的保险柜服务器然后,保险柜服务器中的 THM 会对恢复声明进行解密,并尝试使用已声明的 LSKF 哈希值从原始保险柜中提取恢复密钥(以派生内部加密密钥)。如果原始 LSKF 哈希与认领的 LSKF 哈希匹配,THM 将从保险柜中提取恢复密钥,并使用恢复声明中的声明方密钥重新加密。否则,THM 将触碰失败的尝试计数器。一旦失败的尝试计数器达到其上限,THM 将拒绝处理此保险柜的任何后续恢复声明

最后,如果一切顺利,重新加密的恢复密钥(现已通过权利要求方密钥加密)将从保险柜服务器发回,直至安全框架为止。框架使用其版权主张方密钥的副本来解密恢复密钥,协议现已完成。

安全措施

云密钥保管库系统旨在在我们的堆栈的多个级别添加安全保护措施,以实现“深度防御”。为了让您了解这些保护功能的运作方式,我们将先介绍客户端,然后依次介绍其堆栈和云密钥保险柜服务。

客户端安全性

根据具体的 OEM 和设备,锁定屏幕知识因素 (LSKF) 通常使用各种因 OEM 而异的方法在设备上存储和保护。例如,Google 的 Pixel 2 设备使用防篡改硬件安全模块来存储静态 LSKF,并对 LSKF 验证强制执行基于硬件的速率限制。为支持使用云密钥保险柜而引入的新框架 API 旨在尽可能保留现有的安全保障,即使设备使用此类硬件安全模块保护 LSKF 的存储也是如此。

在本部分中,我们将重点讨论影响新的云密钥保险柜功能的相关安全问题和保护措施,而不是试图全面了解与 LSKF 关联的所有安全机制。

保护框架 API

为支持 CKV 服务而添加的新框架 API 会被标记为 @SystemApi 并需要特殊权限,以确保它们仅供 OEM 批准的系统应用(例如 Google Play 服务)使用。这在很大程度上消除了可能让用户在设备上安装的应用暴露的任何直接攻击面。

Framework API 还可确保仅为已经过信任根认证的同类群组公钥创建保险柜。信任根在出厂时已由 OEM 嵌入到框架中,在操作系统更新的情况下无法更改。这样可以确保 LSKF 仅用于创建将正确强制执行基于硬件的暴力破解保护的保险柜。通过依靠云密钥保管库服务中的 THM 为 LSKF 进行暴力破解保护,我们可以实现与在设备上使用安全硬件相同的安全性(如 Google Pixel 2 设备)。

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

保护恢复代理

我们在恢复代理处提供的主要安全保护是,该协议旨在防止恢复代理看到当前设备的 LSKF 或任何恢复密钥。只有框架才能在客户端看到这些内容,从而更加难以利用恢复代理中的任何潜在错误或安全漏洞。恢复代理主要用于管理生命周期事件以及在云和框架之间来回传递数据。唯一的例外情况是在保险柜打开协议之前的恢复期间,此时用户必须输入旧设备的 LSKF,恢复代理中实现了为旧设备收集已声明所有权的 LSKF 的界面4。但是,一旦框架接管恢复权利的构建工作,恢复代理实现就会“忘记”已声明的 LSKF。

协议的安全功能

虽然对协议进行全面分析不在本文档的讨论范围内,但我们想要重点介绍协议中内置的一些保护措施。具体而言,协议在整个过程中仅使用 LSKF 的哈希。这意味着,如果 LSKF 具有高熵(例如,如果这是一个不错的高熵密码),则存储保险柜绝对优于存储密码哈希值,并且在这种情况下,密码哈希可以提供独立于 THM 的安全性的安全措施。因此,我们在协议中支持对 LSKF 进行加盐“内存硬”哈希处理。我们还会以加密形式将保险柜绑定到创建它的设备的标识符,并将恢复声明绑定到在保险柜打开协议期间用作质询的 Nonce,以确保恢复声明是最新的。

因为恢复密钥是在每次创建保险柜时重新生成的,所以我们使用新创建的保险柜覆盖现有的保险柜条目来实现密钥轮替。保险柜使用的失败尝试计数器的地址是在保险柜创建期间选择的,并且框架确保除非更改了 LSKF 或存在新的同类群组公钥列表,否则用于任何后续保险柜的计数器地址都不会改变。因此,恢复密钥的轮替可以在不损害 LSKF 暴力破解防护的情况下完成。

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

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

硬件保护

在 CKV 服务服务器端实现的主要安全保护功能是使用 Google 自有定制设计 Titan 芯片的可信硬件模块 (THM) 构建而成。这些芯片运行的固件会公开实现 CKV 协议所需的 API。具体而言,它们可以生成密钥对并与其同类群组的其他成员安全共享,以便固件逻辑防止私钥泄露到同类群组中 Titan 芯片之外。他们还可以执行保险柜打开操作,并在保险柜内针对失败的尝试维护严格递增的计数器(其中计数器由 Titan 芯片内存储的状态提供支持)。本文档的未来版本中将详细介绍 CKV Titan 芯片固件所执行的协议。

鉴于服务器安全性源自 Titan 芯片中的固件逻辑,我们必须确保逻辑的更改不会使芯片泄露密钥或忽略计数器限制。为了实现这一目标,我们还更改了 Titan 引导加载程序,以确保在应用任何更新之前已完全清除芯片中存储的数据(例如同类群组的私钥)。这种保护的缺点是,我们无法在不丢失一些数据的情况下修补固件中的 bug。更新固件在功能上等同于销毁现有硬件并将其替换为新芯片。如果需要关键固件补丁,Google 将需要生成并发布经过认证的全新同类群组公钥列表,并逐步将所有用户迁移到新列表。为了降低这种风险,我们会尽量将固件代码库保持在相当小的规模,并仔细审核其中是否存在任何潜在的安全问题。

软件保护

除了 THM 对每个保险柜施加的硬性故障限制之外,CKV 服务还会实施基于软件的速率限制。该速率限制旨在防止黑客入侵用户帐号,并快速耗尽尝试恢复失败的次数限制,从而有效锁定真实用户对其恢复密钥的访问权限。与在解锁屏幕失败次数过多后用户设备施加的延迟时间类似,CKV 服务会在后续每次失败的保险柜打开请求后强制执行增加的延迟时间。

我们还为托管用户数据的云服务实施了标准安全措施,包括严格的访问权限控制、监控和审核。

详细协议规范

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

备注

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