写点什么

Meta 如何实现大规模无身份信息认证?

  • 2022-06-30
  • 本文字数:3796 字

    阅读完需:约 12 分钟

Meta如何实现大规模无身份信息认证?

我们在 Meta 公司不断研发新的隐私增强技术(privacy-enhancing technologies,PET),核心原则之一是数据简约化——仅收集我们服务所需的最少量数据。我们一直在寻找方法来增强用户隐私性,以保护我们所有产品的用户数据。


以前,我们研究过用后置的处理数据方法,去除身份信息或汇总多用户数据,从而简约化数据。然而,这是一种被动的数据简约化方法,以 Meta 公司的规模,可能会非常耗费资源。当我们寻找扩展性更高的解决方案时,我们发现,可以利用“无身份信息认证(de-identified authentication)”的方法来主动消除身份信息。这样一来,我们从信息源头就可以去除身份信息。


在所有客户端-服务器交互中,身份认证对防止端点被爬取、被垃圾邮件塞满或被分布式拒绝服务攻击(DDOS)很有帮助。业内最为广泛采用的身份认证方式,是通过用户 ID 进行身份认证,服务器在提供服务或接收客户端流量之前验证客户端身份。


但我们希望通过去除用户身份信息来提高隐私标准,同时仍能保证身份认证,以保护用户数据和我们的服务。因此,我们利用工业界和学术界多年来合作设计的匿名凭据,创建了称为“匿名凭据服务(Anonymous Credential Service,ACS)”的核心服务。匿名凭据服务是一种高可用的多租户服务,它允许客户端以无身份信息的方式进行身份认证。这增强了隐私和安全性,同时还具有计算意识。匿名凭据服务是我们隐私增强技术产品组合的最新成员之一,目前正在 Meta 公司多个大流量的用例中使用。

匿名凭据如何支持无身份信息认证


在较高抽象层面上,匿名凭据将认证分为两个阶段,来支持无身份信息认证:颁发令牌和无身份信息认证。在颁发令牌阶段,客户端通过一个认证过的通道联系服务器,向服务器发送一个令牌(token)。服务器给令牌签名并将其发回客户端。然后,在无身份信息认证(或称令牌赎回)阶段,客户端使用匿名通道提交数据,并用此令牌的变异形式取代用户 ID 进行身份认证。


我们大幅简化了协议中的细微差别,签名令牌(令牌发行阶段)和赎回令牌(无身份信息认证阶段)两个阶段的数据不再能够直接关联起来,因此服务器在第二阶段对客户端进行身份认证时,无需知道令牌属于哪个特定客户端,从而保护了用户隐私。

匿名凭据协议的工作原理


让我们深入了解一下匿名凭据协议。匿名凭据基于 VOPRF(可验证不经意伪随机函数,它使客户端能够获知自定义输入的可验证伪随机函数评估)和盲签名(一种数字签名,可以防止签名者知道发送者的消息内容)创建。除了前面提到的颁发令牌阶段和无身份信息认证阶段之外,完整的工作流程还有一个设置阶段。


在设置阶段,客户端获取服务器的公钥和其他公共参数。接下来是颁布令牌阶段,客户端创建一个随机令牌并选择一个致盲因子,对令牌进行盲签名,并将盲签后的令牌发送到服务器。反过来,服务器对令牌签名并将其发回客户端。然后客户端对服务器返回的签过名的盲令牌执行非盲操作。客户端还计算 shared_secret,它本质上是原始令牌和服务器签名的函数。


请注意,直到此时,服务器都没有见过原始令牌的值。之后,在无身份信息认证阶段,客户端转发原始令牌、相关业务数据,以及带有 shared_secret 的业务数据的 HMAC(Hash message authentication codes,散列过的消息认证代码)。


然后,服务器可以通过检查这个 HMAC,来验证客户端发送的 shared_secret 与本地计算的 shared_secret 是否相同。如果此检查通过,则服务器将请求视为合法,并处理业务数据。有关该协议的详情,请参阅论文《大规模无身份信息认证遥测(De-identified authenticated telemetry at scale)》

无身份信息认证的真实用例

WhatsApp 上的无身份信息遥测


匿名凭据服务使客户端能够以无身份信息方式进行身份认证。通过匿名凭据服务去除身份认证中的用户 ID,我们可以在满足数据收集简约化目标的同时保护用户隐私。为了服务于生产用例,我们必须创建一个健壮的架构,增强面对现实世界各种问题的适应能力。


WhatsApp上的无身份信息遥测(De-Identified Telemetry,DIT)是当前利用匿名凭据服务的一个用例。以前,我们用安全存储和数据删除策略,确保日志数据不会关联具体用户。但我们希望我们的隐私保护措施更进一步,将匿名凭据服务与 WhatsApp 系统集成,以便对某些 WhatsApp 客户端日志启用无身份信息认证。


大规模部署后,无身份信息遥测使 WhatsApp 在验证日志请求时无需收集身份信息,就能报告性能指标(对确保为每个用户提供快速、无崩溃的应用程序很重要)。整个 WhatsApp 家族都在使用匿名凭据服务,这个庞大的用例需要匿名凭据服务每秒处理数十万个请求。

联合学习


我们要强调的另一个用例是联合学习,这是一种训练全局机器学习模型的技术,私有敏感数据仅保存在本地客户端设备上(不需要上传到服务器)。在这种模式中,设备与服务器共享模型更新而不是原始敏感数据,服务器计算聚合模型的更新来优化全局模型。


这是使用匿名凭据服务进一步保护用户隐私的一种潜在方法。我们不希望恶意行为者发送欺诈性的模型更新数据,但我们希望确保合法用户能够帮助改进全局模型。通过利用匿名凭据服务,我们可以确保合法客户端以无身份信息认证的方式发送客户端模型的更新信息。

匿名凭据服务架构


现在让我们深入了解匿名凭据服务架构。


匿名凭据服务是一个 C++服务,基于 Meta 公司的容器编排框架Twine开发。在全球范围对流量进行负载均衡,每个区域都根据需求动态伸缩。匿名凭据服务为颁发令牌和赎回令牌提供 Thrift API。


有一项重要需求是,在不同用例间构建围栏,隔离匿名凭据服务的令牌。为什么呢?因为我们是多租户的,服务于各种用例。不同用例可能有不同的身份认证机制(例如,脸书用户与 Instagram 用户)。应当禁止不同的用例赎回颁发给特定用例的令牌。


为了解决这个问题,我们要求每个 API 请求都声明自己的用例名称,我们使用针对具体用例的密钥来隔离用例。我们把密钥存储在 Meta 公司的“钥匙串(keychain )”服务中,并通过 Meta 公司的异步作业基础设施定期更换安全密钥。此外,我们还有另一项工作是,在密钥轮换后,发布更新的匿名凭据服务公钥,让客户端可以获取更新后的密钥。

匿名凭据服务扩展的经验教训


在扩展匿名凭据服务的过程中,我们学到了维持服务可靠性和效率的三个关键经验:防止运行匿名凭据服务的成本随着流量的增加而线性增长、避免人为的流量高峰、在不需要专家知识的情况下,推进各个用例接入服务。


随着接入服务的用例越来越多,我们注意到,对新接入的用例,必须按其流量 1:1 的比例添加主机和更多的服务器容量。鉴于最近全球服务器供应链紧张,我们研究了如何简化匿名凭据服务,使其更实用,同时仍能保持我们的高隐私标准。


我们决定允许用例在合理的阈值内重用凭据。在匿名凭据服务服务器上,我们添加了一个重用凭据计数器(由 Meta 公司的分布式键值存储ZippyDB提供支持)。该计数器将计算特定匿名凭据服务令牌被赎回的次数,如果赎回次数超过阈值,则请求失败。针对敏感的用例,还有赎回限制(即不重用令牌)。通过允许重用凭据,可以减少为特定用例颁发令牌的数量,从而节省服务器容量。


我们在扩展时遇到的另一个问题和流量尖峰有关。我们通过观察服务仪表盘,注意到匿名凭据服务的服务器在短时间内收到大量请求。这将导致服务器一时不堪重负,部分请求会失败。


我们发现,这些引起流量尖峰的请求都来自一个大型用例。在与相关的客户团队交谈后,我们了解到,他们把数据缓存在移动客户端上,然后每晚在同一时间,这些移动客户端分别把自己的数据批量发送到服务端。


尽管理论上这是个好主意,但这种模型实际上是在对我们的服务器进行分布式拒绝服务攻击(DDOS),因为突然有众多客户端同时发送了许多请求。为了解决这个特定用例的问题,我们通过添加抖动来分散请求,让它们错开发送时间。为了更普遍地解决这个问题,保护我们服务器的健康,我们与 Meta 公司流量团队合作,添加了一个全局限速器,如果匿名凭据服务流量超过某个速率阈值,限速器将选择性地丢弃这些超额流量。


我们在扩展匿名凭据服务时遇到的最后一个挑战是在工程方面。最初,我们有一个小团队,致力于推广匿名凭据服务,然后发现接入新的用例很困难。当时,接入新用例通常需要我们中的一个人与合作伙伴团队密切合作,解释匿名凭据服务的关键概念,并在我们的服务器上手动配置新的匿名凭据服务用例。


我们通过给接入匿名凭据服务的新用例创建平滑的接入体验来减轻这种合作成本。我们用 React 构建了一个自助接入匿名凭据服务的站点入口。现在,来自 Meta 公司的工程师们,可以使用该站点作为匿名凭据服务的一站式商店。


此外,我们为 Android 和 iOS 创建了匿名凭据服务客户端 SDK,以提供高质量的加密原语和协议实现。客户端可以调用高级方法,例如直接获取匿名凭据服务令牌(fetch-acs-token),不需要自己一步一步构建令牌。这些方法通过调用匿名凭据服务的 API、去盲化令牌和执行所有其他相关操作,来处理整个令牌交换协议。我们还改进了维基上的接入文档,投入资源开发了 codegen 工具。这进一步减少了客户的编码量,更容易与我们集成,让他们无需专家级的密码学知识即可使用我们的协议。


无身份信息化是保护数据和隐私的重要工具。共享和保护数据需要信任和责任感。展望未来,我们希望将匿名凭据服务进一步集成到 Meta 公司的数据基础架构中,并在身份认证用例之外的产品中用它进一步保护数据隐私。


我们希望我们的工作能够激发整个行业研发更多的隐私增强技术。


查看英文原文How Meta enables de-identified authentication at scale

2022-06-30 10:023253

评论

发布
暂无评论
发现更多内容

节日快乐…吗?

小天同学

个人感悟 国庆中秋 假期 节日

架构师训练营1期第三周作业

木头发芽

第三节课后作业

happy

手把手教你锤面试官 03——Spring怎么那么简单

慵懒的土拨鼠

关于代码审查的一点体会

KJ Meng

敏捷开发 研发管理 代码审查 Code Review

MySQL-技术专题-主从复制原理

码界西柚

第三周作业

Geek_ac4080

第四周

Geek_fabd84

如何使用 dotTrace 来诊断 netcore 应用的性能问题

newbe36524

微服务 .net core netcore ASP.NET Core

私有云PAAS平台的思考

8小时

架构师训练营 第三周作业

haha

极客大学架构师训练营

各角色如何从DevOps中受益?

禅道项目管理

DevOps 产品经理 测试 开发 运维工程师

如果朋友圈没有点赞功能,你还会发朋友圈吗

彭宏豪95

微信 产品 互联网 写作

~~寒露节记~~

wo是一棵草

JavaScript 语言通识 — 重学 JavaScript

三钻

Java 大前端

基于区块链技术实现“资产通证化”

CECBC

资产证券化 流动性

第三周总结

Geek_ac4080

这可能是GitHub上最适合计算机专业学生看的编程教程

小Q

Java 学习 编程 面试 基础

架构师训练营第一期 - 第四周课后 - 作业一

极客大学架构师训练营

干货 | 全面解析“数字经济”

CECBC

数字经济 经济 经济建设

开源的意义与价值

Braisdom

Java 开源 ORM

区块链技术最重要价值所在

CECBC

区块链 数字经济 经济

架构师训练营第三周:系统架构

m

看动画学算法之:linkedList

程序那些事

数据结构和算法 看动画学算法 看动画学数据结构 算法和数据结构

Nginx 整合 FastDFS 实现文件服务器

哈喽沃德先生

nginx 文件系统 分布式文件存储 fastdfs 文件服务器

线上服务平均响应时间太长,怎么排查?

小Q

Java 程序员 测试 Jmeter 性能调优

「剑指offer」27道Mybatis面试题含解析

Java架构师迁哥

云原生虚机应用托管-设计篇

8小时

Python时间序列分析简介(1)

计算机与AI

Python pandas 数据处理 时间序列

【第三周】代码重构

云龙

【第三周】课后作业

云龙

Meta如何实现大规模无身份信息认证?_文化 & 方法_Meta AI 团队_InfoQ精选文章