身份验证器数据

认证器数据结构包含来自认证器的有关凭证创建或身份验证请求处理的信息 — 例如 Relying Party ID 哈希 (rpIdHash)、签名计数器、用户存在性测试、用户验证标志以及认证器处理的任何扩展。本页将解释数据结构中包含的内容。

访问认证器数据

认证器数据以 ArrayBuffer 的形式提供给浏览器,可以通过多种方式访问。最方便的两种方式是

数据结构

认证器数据的 ArrayBuffer 长度至少为 37 字节,并包含以下字段:

rpIdHash (32 字节)

凭证所归属的 Relying Party ID 的 SHA-256 哈希。服务器将确保此哈希与自身 Relying Party ID 的 SHA256 哈希匹配,以防止网络钓鱼或其他中间人攻击。

flags (1 字节)

一个位字段,指示认证器声称的各种属性。位如下所示,其中位 0 是最低有效位,所有未特别提及的位都“保留供将来使用”。

  • 位 0,用户存在性 (UP): 如果设置 (即为 1),则认证器通过某种用户存在性测试 (TUP),例如触摸认证器上的按钮,验证了用户的存在。
  • 位 2,用户验证 (UV): 如果设置,则认证器通过生物识别、PIN 或其他方法验证了实际用户。
  • 位 3,备份可用性 (BE): 如果设置,则认证器用于生成断言的公钥凭证源是可备份的。这意味着它可以以某种方式进行备份(例如通过云或本地网络同步),因此可能会出现在生成器认证器以外的认证器上。因此,可备份的凭证源也称为多设备凭证。
  • 位 4,备份状态 (BS): 如果设置,则公钥凭证源当前已备份(有关上下文,请参阅位 3)。
  • 位 6,认证凭证数据 (AT): 如果设置,则认证凭证数据将紧跟在此 authenticatorData 的前 37 个字节之后。
  • 位 7,扩展数据 (ED): 如果设置,则存在扩展数据。如果存在认证凭证数据,则扩展数据将紧跟在认证凭证数据之后;如果不存在认证凭证数据,则扩展数据将紧跟在 authenticatorData 的前 37 个字节之后。
signCount (4 字节)

签名计数器(如果认证器支持)(否则设置为 0)。服务器可以选择使用此计数器来检测认证器克隆。

attestedCredentialData (可变长度)

已创建的凭证。此项仅在调用 navigator.credentials.create() 时存在。这是一个字节序列,格式如下:

  • AAGUID (16 字节): 认证器归属全局唯一标识符,一个唯一的数字,用于标识认证器的型号(而不是认证器的特定实例)。Relying Party 可以通过 FIDO 元数据服务查找其元数据语句来使用此标识符来了解认证器的特性。这在某些情况下(例如企业部署或法规要求必须使用特定类型的认证器时)很重要;否则应忽略。

  • credentialIdLength (2 字节): 紧跟在这些字节之后的凭证 ID 的长度。

  • credentialId (可变长度): 此凭证的唯一标识符,以便将来进行身份验证时请求。凭证的长度为“credentialIdLength”字节。

  • credentialPublicKey (可变长度): 一个 COSE 编码的公钥。此公钥将存储在服务器上,与用户的帐户关联,并用于将来的身份验证。Relying Party 可以通过 AuthenticatorAttestationResponse.getPublicKey() 方法检索其 DER 编码形式,而无需解析 COSE 编码的认证器数据。

extensions (可变长度)

一个可选的 CBOR 映射,包含认证器处理的扩展的响应输出。

扩展是可选的,不同的浏览器可能支持不同的扩展。浏览器始终可以忽略扩展:如果浏览器不识别某个扩展,它将直接忽略它。有关使用扩展以及哪些扩展受哪些浏览器支持的信息,请参阅 Web Authentication 扩展

注意: 认证器数据仅包含认证器处理的扩展的结果。浏览器(客户端)处理的扩展的结果可以通过 PublicKeyCredential.getClientExtensionResults 访问。

另见

WebAuthn 规范中的认证器数据定义