Adam Powers,FIDO联盟技术总监
FIDO 中有一个经常被提及但鲜为人知的术语:证明。 即使是实施 FIDO 产品的工程师也经常对证明的工作原理或为什么需要证明感到困惑。 本技术说明旨在阐明证明及其在 FIDO 交易中的作用;这篇文章主要是为技术社区准备的,但希望对有基本了解的外行人也能清楚。
首先,每次用户注册新服务(Google、Facebook、PayPal、GitHub 等)时,FIDO 身份验证器都会为该服务生成一个新的密钥对。 密钥对于该服务必须是唯一的,并且不会在服务之间共享。 这是最常与 FIDO 关联的密钥对,称为“凭据密钥对”或简称为“密钥对”。 当用户向服务注册时,会生成一个新的密钥对,并将公钥发送到服务以供存储,并在将来用于对用户进行身份验证。 该密钥对不是证明密钥对,为了进一步混淆,该密钥对用于称为“断言”的操作(在身份验证期间对质询进行签名)。 术语“断言”和“证明”经常被混淆——断言发生在身份验证时;证明在注册期间进行。
图 1 :为用户注册的每个服务生成一个新的“凭据密钥对”。
考虑到这种情况,什么是证明? 它是在特定于设备型号的制造时间内刻录到设备的密钥对。 例如,所有 YubiKey 4 设备都具有相同的证明证书;或者所有三星Galaxy S8都具有相同的证明证书。 该证明特定于设备模型,可用于以加密方式证明用户在注册时具有特定型号的设备。 当用户创建上述新的“凭据密钥对”时,发送到服务的公钥将使用证明私钥进行签名。 为用户创建新帐户的服务可以验证新创建的公钥上的“证明签名”是否来自设备。
一般而言,证明密钥具有关联的证明证书,这些证书链接到服务信任的根证书。 这就是服务建立对身份验证器证明密钥的信任的方式。
图 2 :在注册期间,将创建一个新的公钥,并由在制造设备时随设备创建的证明私钥进行签名。
证明完成两件事: 1) 如果攻击者用自己的注册消息拦截注册消息,他们将无法用自己的公钥交换新的公钥,因为证明签名不匹配;和 2) 它允许服务相信它知道正在使用的身份验证器的来源。
乍一看,防止攻击者用自己的公钥替换公钥似乎是证明的更重要方面。 但是,注册 FIDO 通常要求用户已具有经过身份验证的会话,并且通信受 TLS 保护,因此恶意行为的机会不大。 因此,如果身份验证器使用“自我证明”,许多服务不会拒绝身份验证器。 自我证明(也称为代理证明)是指身份验证器使用自签名证书,而不是链接回某个根证书的证明证书。
但是,某些服务(例如金融行业或公共部门的服务)可能需要了解有关访问其服务的设备的更多信息。 他们必须保证加密密钥是安全的,生物识别技术具有一定程度的准确性等。 这就是证明的第二个方面,它使服务能够信任注册请求来自特定模型的 FIDO 身份验证器。
在注册期间,设备的唯一型号将与新创建的公钥一起发送到服务。 唯一型号是 UAF 中的“身份验证器证明 ID”(AAID);FIDO2 中的“身份验证器证明全局唯一 ID”(AAGUID);或 U2F 中的“证明证书密钥标识符”。 在注册期间从用户那里收到新的公钥后,此唯一标识符可用于在服务中查找元数据语句,例如 FIDO 元数据服务 (MDS). MDS 中的每条记录都有一个与设备对应的 AAID、AAGUID 或证明证书密钥标识符。
找到正确的记录后,该记录将包含两种基本信息: 1) “证明根证书”;和 2)有关设备的元数据。 我们之前提到过“自我(或代理)证明”,但设备也可以使用“完全基本证明”,其中证明证书链接到一些已知的证明根证书。 假设公钥上的证明签名是正确的,并且证书链已验证为根证书,则服务可以信任有关设备的其他元数据,例如设备的安全性和生物识别特征。
(注意:FIDO 身份验证器认证计划测试并确保密钥和其他机密受到保护,免受外部威胁。FIDO将很快推出一项生物识别认证计划,以确保生物识别技术正确验证用户。这两个认证都显示为有关身份验证器的元数据,提供更多信息,使服务能够建立对身份验证器的更强信任。
图 3 :在注册期间,服务可以使用设备的唯一标识符从元数据服务 (MDS) 中查找有关设备的“根证明证书”和属性。
对于 UAF 和 U2F,每个都有自己的证明格式。 UAF 具有自定义的“标记长度值”(TLV公司) 结构,其中包含的信息不仅仅是证明签名,而 U2F 协议仅具有证明证书和证明签名。 随着 FIDO2 和 WebAuthn 的推出,越来越多的平台将证明作为内置于平台中的服务包括在内。 Android 具有 SafetyNet 和 Android 密钥证明。 大多数现代电脑都具有 TPM 证明,随着平台的发展,预计未来会有更多的证明格式。 因此,WebAuthn 定义了多种证明格式,并允许将来添加新的证明格式。
希望这有助于澄清什么是证明以及如何使用它,但还有一点要说明——这确实是我写这篇文章的原因。 请注意: 证明应该是设备模型的唯一证明,而不是单个设备 。
与所有 FIDO 操作一样,证明的关键属性之一是它必须保护用户的隐私。 证明密钥对于设备模型是通用的,而不是每个单独的设备都有自己的密钥,这是因为证明不能用作标识和跟踪用户的一种方式。 在最近的一次 FIDO 互操作中,我有幸与一些非常聪明、受过良好教育的工程师一起工作,他们对 FIDO 的实现非常出色;但是,他们不明白不应为设备的每个实例创建新的证明证书。 这存在潜在的问题 – 如果购买手机或安全密钥型号的每个人都获得相同型号的设备,但具有不同的证明证书,则该证明证书可用于跨服务跟踪和识别个人。 FIDO 建立在强隐私原则之上,使用证明来跟踪用户会违反 FIDO的隐私原则. 确保在同一模型 (100,000+) 的大批量身份验证器中使用证明证书可确保无法根据用户的证明证书进行跟踪。 我希望这篇博文有助于确保我们都正确使用证明证书并保护用户的隐私。