我们介绍了一种云服务,该服务使用安全硬件存储加密密钥,以便对密钥的访问受低熵知识因子(例如锁屏 PIN 码)保护。安全硬件旨在防止暴力破解攻击,方法是:如果用户在尝试提供正确的知识因子时失败的次数过多,则存储的加密密钥将永久无法检索。
作者:Shabsi Walfish
版本日期:2018 年 3 月 6 日
注意:本文档仍在完善中,实现细节仍待最终确定。随着系统稳定下来并能够生成更多文档,我们会更新本白皮书,提供更多详细信息(尤其是与相关开源版本相关的信息)。
概览
传统上,加密(用于确保数据隐私)需要使用从攻击者的角度来看具有高熵的密钥。需要高熵,因为加密方案必须能够抵御暴力破解攻击,这种攻击会探索所有可能的密钥空间,直到找到正确的密钥。鉴于目前可用的计算能力,对加密密钥合理的最小熵要求可能在 70 到 80 位之间。遗憾的是,人类很难记住并可靠地回想具有如此熵值的密码或其他密钥1,尤其是如果这些密码或密钥很少使用(但频繁使用高熵密码既困难又乏味)。这给我们带来了一个具有挑战性的问题:如果我们希望密钥是用户很可能会记住的“知识因子”,那么如何利用加密技术保护私密数据?由于各种原因,这个问题很难解决,因此云端存储服务通常只使用由云端存储服务提供商自行管理的密钥来加密数据,而不是依赖用户记住自己的密钥。
为了弥合加密 Secret 和人类可记忆 Secret 的要求差距,一种方法是使用 Cloud Key Vault (CKV) 服务存储高熵“恢复密钥”,该密钥由低熵人类可记忆 Secret 保护。CKV 服务只会向能够证明自己知道正确的人类可记忆秘密的一方提供恢复密钥。CKV 服务可以防范针对人类可记忆的密钥的暴力破解攻击,它会对证明对密钥的了解而尝试失败的次数强制施加绝对限制。恢复密钥本身是一种标准的加密对称密钥,适用于(经过身份验证的)加密方案,可轻松加密大量数据(例如磁盘备份),这些数据可安全地存储在任何位置 - 无法获取恢复密钥的任何人对此类加密数据都无用。
本文白介绍了我们使用可信硬件模块 (THM) 构建 Cloud Key Vault 服务的方法。我们首次实现 CKV 服务旨在使用用户的锁屏知识因子 (LSKF) 保护恢复密钥,LSKF 是指用于解锁智能手机的秘密 PIN 码、密码或滑动图案。人类可以可靠地记住自己的 LSKF。 与此同时,此类 LSKF 密钥通常具有足够的熵,足以抵御尝试次数非常有限的攻击者,因此非常适合 CKV 服务。
Cloud Key Vault 服务的首个应用场景将是启用客户端加密的 Android 备份。以前,在 Android 设备上本地加密的文件使用的是使用用户的 LSKF 保护的密钥,但存储(并加密)在云端的这些文件的备份不受 LSKF 保护。Cloud Key Vault 首次支持为存储在云端的 Android 备份启用锁屏保护。这意味着,Google 的服务器无法访问或恢复加密备份的内容,只有具有用户 LSKF 的设备才能对备份进行解密。
核心概念
最初,Cloud Key Vault 服务仅支持 Android 9 Pie 操作系统作为客户端平台。在本白皮书中,我们提及客户端时,是指搭载 Android 9 Pie 操作系统且支持 Google Play 服务的设备。我们的服务器端实现在专门指定的 Google 服务器上运行,这些服务器内安装了额外的 Titan 芯片2。Google 设计的 Titan 芯片是可信硬件模块中的硬件组件,我们为其专门预配了实现我们的协议和安全强制执行机制(如本文所述)的自定义引导加载程序和固件。我们使用硬件认证技术,以确保我们的协议确实在 Titan 硬件上运行。
CKV 服务必须能够扩容,以处理来自数十亿部 Android 设备3的流量,并且不会因硬件故障(例如烧毁的芯片)而丢失大量用户数据,也不会因数据中心维护而出现任何长时间的中断。因此,装有 Titan 芯片的服务器会被划分为同类群组,每个同类群组由多个独立的 THM 组成,每个 THM 都包含相同密钥材料的副本。给定同类群组将分布在不同维护区域中物理上不同的数据中心,以确保系统能够实现其可用性和可靠性目标。为了实现可伸缩性,客户端将分片到多个不同的同类群组,这样我们只需添加更多服务器来增加可用同类群组的数量,即可调整服务容量。
现在,我们可以枚举 Cloud Key Vault 服务架构的主要组件了。
架构组件/术语表
锁定屏幕知识因素 (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。
恢复密钥:一种由 Cloud Key Vault 服务保护的加密密钥,用于在客户端设备上加密(和身份验证)数据。 将恢复密钥放入保险柜(见下文)后,只要客户端使用该密钥加密数据完毕,就可以立即删除本地副本。
Cloud Key Vault (CKV) 服务:一种互联网服务,可让客户端设备存储由人类可记忆的 LSKF 保护的加密密钥。
-
同类群组:一组 Vault 服务器/THM,它们可以作为彼此的冗余副本。
同类群组公钥:由特定同类群组的 THM 生成的密钥对中的公钥。相应的私钥仅在密钥生成时属于同类群组的 THM 中可用。
可信硬件模块 (THM):一种专用安全模块(微控制器),旨在提供最小且可信的计算环境。安全元件至少必须能够生成和/或存储密钥,并维护一些不断演变的非易失性状态(以便防止涉及重置到较早状态的攻击)。
保险柜:CKV 服务数据库中的特定条目,包含单个设备的 LSKF 保护恢复密钥。最终用户可以有多个已登记的保险柜,每个保险柜对应于不同的设备或 LSKF。只有保险柜服务器中的 THM 才能检查或提取保险柜中的内容。
保险柜服务器:在 Google 数据中心内运行的通用计算机,经过专门改装以添加可信硬件模块 (THM)。
协议设计
CKV 协议由多个阶段组成,如下所示:
初始化
为了初始化系统,Google 将为“信任根”提供公钥,该框架将使用该公钥来验证 Google 的硬件认证。此信任根的签名密钥会离线存储并妥善保护,因此需要多名员工共同参与才能使用该密钥进行签名。此信任根的公钥已内置到 Android OS 中,只能通过 OS 更新进行更改。
Google 还会定期发布每个 THM 同类群组的公钥列表,以及该列表中的认证。列表中的认证使用可链接回信任根的签名。已发布列表的每次更新还包含一个序列号,以便防止回滚。恢复代理将提取最近发布的同类群组公钥列表,并将其提供给框架。然后,框架会验证证明,并从列表中随机选择一个同类群组公钥,以在创建保险柜阶段使用。
保险柜创建
通过提取同类群组公开密钥列表来帮助框架完成初始化后,恢复代理将请求框架创建新的保险柜。每当用户下次输入 LSKF 时,框架都会生成一个新的恢复密钥,并先使用从 LSKF 的哈希派生的密钥对其进行加密,然后再使用框架在初始化期间选择的同类群组公钥对其进行加密。生成的加密 blob 是框架传回给恢复代理的保险柜,然后恢复代理将其上传到 Google 的 CKV 服务。
保险柜打开
当新设备上的恢复代理需要访问存储在特定保险柜中的恢复密钥时,它会先提示用户输入创建保险柜的原始设备的 LSKF。然后,恢复代理会要求框架使用该 LSKF 创建恢复声明。该框架将生成一个新的声明者密钥,并使用最初用于加密保险柜的同类群组公钥对该声明者密钥以及声明的 LSKF 的哈希进行加密。生成的加密 blob 称为“恢复声明”,框架会将其传递给恢复代理,后者会将其提交给 CKV 服务。
CKV 会将恢复声明(及其对应的保险柜)路由到正确同类群组中的保险柜服务器。然后,保险柜服务器中的 THM 会解密恢复声明,并尝试使用声明的 LSKF 哈希(以派生内部加密密钥)从原始保险柜中提取恢复密钥。如果原始 LSKF 哈希值与声明的 LSKF 哈希值匹配,THM 将从保险柜中提取恢复密钥,并使用恢复声明中的声明方密钥对其进行重新加密。如果没有,THM 将递增失败尝试次数计数器。失败尝试次数计数器达到上限后,THM 将拒绝处理此保险柜的任何后续恢复声明。
最后,如果一切顺利,重新加密的恢复密钥(现在已使用声明者密钥进行加密)会从保险柜服务器一直发送回框架。框架使用其声明者密钥的副本解密恢复密钥,协议现已完成。
安全措施
Cloud Key Vault 系统旨在通过在堆栈的多个层级提供安全保护来提供“纵深防御”。为了让您了解这些保护措施的运作方式,我们将首先介绍客户端,然后逐步向上,介绍 Cloud Key Vault Service。
客户端安全性
锁定屏幕知识因素 (LSKF) 通常使用因 OEM 而异的各种方法存储和保护在设备上,具体取决于特定 OEM 和设备。例如,Google 的 Pixel 2 设备使用抗篡改硬件安全模块来存储处于休眠状态的 LSKF,并对 LSKF 验证强制执行基于硬件的速率限制。为了支持使用 Cloud Key Vault,我们引入了新的框架 API,旨在尽可能保留现有的安全保证,即使设备使用此类硬件安全模块来保护 LSKF 的存储也是如此。
本部分将重点介绍影响新版 Cloud Key Vault 功能的相关安全问题和保护措施,而不是尝试全面介绍与 LSKF 相关的所有安全机制。
保护框架 API
为支持 CKV 服务而添加的新框架 API 被标记为 @SystemApi,并且需要特殊权限,这可确保它们仅供 OEM 批准的系统应用(例如 Google Play 服务)使用。这在很大程度上消除了可能向用户在设备上安装的应用公开的任何直接攻击面。
框架 API 还可确保仅为经过信任根证明的同类群组公钥创建保险柜。信任根是在框架出厂时由 OEM 嵌入的,在没有操作系统更新的情况下无法更改。这样可以确保 LSKF 仅用于创建将正确强制执行基于硬件的暴力破解保护措施的保险柜。通过依赖 Cloud Key Vault 服务中的 THM 为 LSKF 提供暴力破解保护,我们可以实现与在设备上使用安全硬件来实现相同目的相当的安全性(如 Google Pixel 2 设备所做的那样)。
由于我们不假定 LSKF 会存储在安全硬件以外的设备任何位置,因此只能在设备解锁后立即创建新的保险柜。当用户输入 LSKF 以解锁设备时,LSKF 会短暂地提供给 RAM 中的框架。创建保险柜的新 API 会在该时刻使用该密钥。在设备处于锁定状态时,无法创建新的受 LSKF 保护的保险柜,因为 LSKF 不可用。
保护恢复代理
我们在恢复代理中提供的主要安全保护是,该协议旨在防止恢复代理看到当前设备的 LSKF 或任何恢复密钥。只有框架应在客户端看到这些内容,这使得利用 Recovery Agent 中的任何潜在 bug 或安全漏洞变得更加困难。Recovery Agent 主要用于管理生命周期事件以及在 Cloud 和 Framework 之间传递数据。唯一的例外情况是,在恢复期间,在打开保险柜协议之前,用户必须输入旧设备的 LSKF;用于收集旧设备声明的 LSKF 的界面在恢复代理4中实现。不过,一旦框架接管恢复声明的构建,Recovery Agent 实现就会“忘记”已声明的 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 开源项目中发布客户端代码后更新,以包含这些详细信息。
备注
- “Towards Reliable Storage of 56-bit Secrets in Human Memory | USENIX.”2014 年 8 月 1 日,https://www.usenix.org/node/184458。 ↩
- “Google Cloud Platform 博客:Titan 深入介绍:明文安全。”2017 年 8 月 24 日,https://cloudplatform.googleblog.com/2017/08/Titan-in-depth-security-in-plaintext.html。 ↩
- “Google 宣布 Android 设备的月活跃设备数超过 20 亿……”。2017 年 5 月 17 日,https://www.theverge.com/2017/5/17/15654454/android-reaches-2-billion-monthly-active-users。 ↩
- 这样,我们就可以提供灵活的界面来输入其他设备的 LSKF,因为当前设备的框架可能没有适用于输入旧设备 LSKF 的界面。 ↩