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 服务。这在很大程度上避免了可能给设备上安装的应用带来的直接攻击面。

框架 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 服务会在后续每个后续失败的保险柜打开请求后强制执行增加的延迟时间。

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

详细协议规范

详细的协议规范仍在制定中,本文档会进行更新,以便纳入这些详细信息,并于今年晚些时候在 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。