Meta向社群开源了匿名凭证服务(Anonymous Credential Service,ACS),这是一个高可用的多租户服务,供客户端能够以去识别化的方式,进行用户身份验证。
ACS可以应用的场景有很多,Meta以自家的日志记录应用来解释开发ACS的原因。Meta在日志记录实施资料最小化精神,仅收集支持服务所需要的最少资料,目标是要在提高用户体验的同时,收集和使用更少的资料。
在Meta大多数日志记录用例中,用户身份并非必要,因此需要从日志记录资料中排除,官方提到,移除身份验证是删除可识别码的一种方法,但是这样却会使系统容易受到包括资料注入等攻击。为此Meta创建了一个更好的去识别身份验证方法ACS,从高层次来看,ACS通过将身份验证分为权限发行和权限兑换(Token Redemption)两个阶段,来进行去识别化身份验证。
在权限发行阶段,客户端通过身份验证的信道联系服务器发送权限,服务器会签署权限并将其送回,接着去识别化身份验证,也就是权限兑换阶段,客户端使用去识别化信道提交资料,并使用权限的变异形式,而非以用户ID进行身份验证。
匿名凭证协议创建在VOPRF(Verifiable Oblivious Pseudorandom Function)和盲签名技术之上。以日志记录为例,Meta将工作流程拆分成两个步骤解决日志去识别化的问题,首先客户端会经过身份验证,连接到服务器进一步获得匿名凭证,之后每当客户端需要上传日志的时候,便会连同匿名凭证和日志,一起发送到服务器未经身份验证的连接中,而匿名凭证便用做客户端真实性的证明。
Meta解释,之所以这个协议有效,是因为业务资料和身份验证资料分离,业务资料使用非盲权限发送,而身份资料则使用盲权限发送。不过权限发行和权限兑换不会同时发生,客户端可以将权限存储数小时甚至数天,当客户端想要记录资料却没有权限,可以获取权限并且立刻进行兑换,只不过这两步骤会在单独的请求中,避免任何人可从资料中推断出用户身份。
但要将匿名凭证用于现实的大规模系统仍需要解决一些挑战,第一是权限兑换的计数,在理想情况,一个凭证应该只能兑换一次,但是在实例中,由于要减少服务器负担,Meta接受多次兑换凭证,Meta使用安全的计数服务来限制权限兑换次数。
另外,匿名凭证协议需要一个密钥对,服务器使用密钥对权限进行签章,以便验证兑换请求,客户端则需要一个对应的公钥来解锁权限,Meta提到,密钥轮换对于ACS来说非常重要,这能够减轻万一用户在获得凭证才遭窃产生的影响。
Meta在ACS存储库发布了一个可扩展C函数库,其主要组件包括VOPRF协议,用于客户端权限盲化、非盲化,以及生成用于权限兑换的共享秘密。ACS存储库还有属性密钥衍生函数、离散日志证明,Meta还用C++实例了用于演示的服务器和客户端程序。