Get your free and exclusive 80-page Banking Passkey Report

WebAuthn 中的认证 (Attestation) 是什么?

Vincent Delitz

Vincent

Created: June 17, 2025

Updated: July 8, 2025


See the original glossary version in English here.

什么是认证 (Attestation)?#

认证 (Attestation) 可以指三件事(在口语中,它们经常可以互换使用,尽管严格来说它们的含义有所不同):

  1. 首先,也是更普遍的,在密码学领域,认证是一个术语,指一方以密码学方式向另一方“证明”一个声明。

  2. 其次,在 WebAuthn 的注册阶段,认证器 会创建一个认证对象并返回给信赖方。它是一个包含以下信息的容器对象:

Slack Icon

Become part of our Passkeys Community for updates & support.

Join
  1. 第三,在 WebAuthn 中,认证声明是认证对象的一个可选元素。当包含此声明时,它会验证参与认证过程的认证器(设备)的某些特征。然而,一些设备制造商(例如苹果)不提供认证声明,因为规范的这一方面并非为密钥同步而设计,并且当凭证可以在不同设备间同步时(例如,在 iPhone 上创建的密钥也通过同一个 iCloud 钥匙串 同步到 MacBook 上使用),它无法有效验证安全属性。当提供认证声明时可以给出的特征:
    • 提供在身份验证期间使用了真实可信设备的证明。
    • 提供有关设备来源、型号和其他相关信息的详细信息。
    • 增强安全措施,尤其是在设备可信度至关重要的场景中(例如,某些受监管的行业,如医疗保健)。

以下注册流程图显示了认证(对象)在 WebAuthn 中的作用:

认证对象示例#

{ "root": { "id": "QFPlQVypLmmx71e0tmS3IfCFky0", "rawId": "QFPlQVypLmmx71e0tmS3IfCFky0", "response": { "attestationObject": { "fmt": "none", "attStmt": {}, "authData": { "rpIdHash": "t8DGRTBfls-BhOH2QC404lvdhe_t2_NkvM0nQWEEADc", "flags": { "userPresent": true, "userVerified": true, "backupEligible": true, "backupStatus": true, "attestedData": true, "extensionData": false }, "counter": 0, "aaguid": "00000000-0000-0000-0000-000000000000", "credentialID": "QFPlQVypLmmx71eOtmS3IfCFky0", "credentialPublicKey": "pQECAyYgASFYIEa-lpSiQ4P...", "parsedCredentialPublicKey": { "keyType": "EC2 (2)", "algorithm": "ES256 (-7)", "curve": 1, "x": "Rr6WlKJDg8MlbIq9mmHQzk2p2c_s7QoNKr7yMa7I8pM", "y": "tAELYp7h3sYNjZZIZgHPYiaSzF×QVT18cgZ_7wm13Vw" } } }, "clientDataJSON": { "type": "webauthn.create", "challenge": "AAABeB78HrIemh1jTdJICr_3QG_RMOhp", "origin": "https://passkeys.eu", "crossOrigin": false }, "transports": ["hybrid", "internal"], "publicKeyAlgorithm": -7 }, "authenticatorAttachment": "cross-platform" } }

在上面的截图中,没有提供 AAGUID 和认证声明。

Debugger Icon

Want to experiment with passkey flows? Try our Passkeys Debugger.

Try for Free

继续阅读以了解最重要属性的技术分解。

关键要点#

  • 认证是指一方以密码学方式向另一方证明一个声明的过程。
  • WebAuthn 中的认证对象由认证器创建,并在注册期间传递。它包含 AAGUID凭证 ID 和公钥等信息。
  • WebAuthn 中的认证声明是认证对象中的一个可选字段,用于确保身份验证使用了真实的设备。

理解认证的本质#

WebAuthn 中,认证确保用户身份验证是安全和透明的。通过认证声明,您可以确保凭证是在特定的认证器/设备上创建的。

认证类型:#

这些认证类型指的是认证声明(而非认证对象)。它们被信赖方视为一种偏好(因此认证器的行为可能会有所不同,因为它只是一种偏好)。

  • 无认证 (none):对于隐私至关重要或涉及同步设备的场景,此类型不提供有关设备的任何信息,确保用户隐私完好无损。使用此值的另一个原因可能是为了节省到证书颁发机构 (CA) 的往返通信。none 也是默认值。
  • 间接认证 (indirect)信赖方倾向于获取认证,但允许客户端决定如何获取认证声明。客户端可以用匿名的认证声明替换认证器生成的认证声明,以保护用户隐私。
  • 直接认证 (direct):这是最透明的形式。在这里,信赖方告知认证器它需要一个认证声明,以便信赖方可以获取有关设备的详细信息,包括其品牌、型号和其他具体信息。虽然它提供了最高的透明度,但在某些情况下可能会引发隐私问题,或者对于同步凭证可能并不真正适用。
  • 企业认证 (enterprise)信赖方希望收到一个可以包含唯一识别信息的认证声明。这种类型的认证通常用于希望跟踪特定设备/认证器的企业或组织。Web 浏览器(用户代理)不应提供这种详细的认证,除非其设置特别允许请求方这样做。如果设置允许,浏览器应在流程开始时告知设备正在请求这种特定类型的认证。然后,浏览器应将其收到的设备唯一 ID 和认证证明原样传递给信赖方。
Substack Icon

Subscribe to our Passkeys Substack for the latest news.

Subscribe

认证对象的属性#

认证对象包含许多属性,以下是一些选定属性的简要说明:

attestationObject#

"attestationObject": { "fmt": "none", "attStmt": {}, "authData": { "rpIdHash": "t8DGRTBfls-BhOH2QC404lvdhe_t2_NkvM0nQWEEADc", "flags": { "userPresent": true, "userVerified": true, "backupEligible": true, "backupStatus": true, "attestedData": true, "extensionData": false }, "counter": 0, "aaguid": "00000000-0000-0000-0000-000000000000", "credentialID": "QFPlQVypLmmx71eOtmS3IfCFky0", "credentialPublicKey": "pQECAyYgASFYIEa-lpSiQ4P...", "parsedCredentialPublicKey": { "keyType": "EC2 (2)", "algorithm": "ES256 (-7)", "curve": 1, "x": "Rr6WlKJDg8MlbIq9mmHQzk2p2c_s7QoNKr7yMa7I8pM", "y": "tAELYp7h3sYNjZZIZgHPYiaSzF×QVT18cgZ_7wm13Vw" } }

attestationObject 是一个 CBOR 编码的对象,包含有关新创建的凭证、公钥和其他相关数据的信息:

  • fmt 代表认证格式,因为认证器可以以不同方式提供认证数据。它告诉服务器应如何验证认证数据。允许的值为 "packed"、"tpm"、"android-key"、"android-safetynet"、"fido-u2f"、"apple" 或 "none"。详情请见此处
  • attStmt 是认证声明。对于密钥,例如在 iOSAndroid 设备上,它被留空,因为 iOSAndroid 上的密钥可以同步。而对于其他设备,如 Windows 或硬件安全密钥,则会填充此字段。
  • authData 是一个包含以下数据的值缓冲区: 经认证的凭证数据在此扮演着重要角色。它包含:

attStmt(认证声明)#

与上面为了可读性而将 attStmt 留空的认证对象相反,这是一个填充了内容的认证声明的样子。

{ "alg": -65535, "sig": "MBHX7qov53SWqqPYCrxE5fcoAeDI83a0DzVJ2-N1KI6IAaCGGvINAIFzTEn44F6giANKte-8yEMDZbvbgDG1weaRj7SqsVaTty-TEQ", "ver": "2.0", "x5c": [ "MIIFwDCCA6oIaK6tZ7M", "MIIG6zCCBNpG18-MCJrHyrpMT-ul7RgxE4dFxqcG59ftTXqJ1f-X_Lpo7K-d7OgKoQrUgzxgATz8YXtFAk3rE1cHXvW9W52V637eAihKn9-UKC0ijzVXrBGX4Iq1o1M0ZfR-tFoOn498xasMCTnharKiM562GBLVJtlvV3DMSLEBl5SfuGM-qYjQgTQknXccks9guCmNaN_b2fo1DisbufXfjM3DVaMqx7IJpSc3wAnxooMrAYGpPM" ], "pubArea": "AAEACwAw_c3Ousz865mUPx8O3w", "certInfo": "_1RDR4AXAniCekfsiDI" }
  • alg:alg 属性表示认证器用于签署认证声明的加密算法标识符。
  • sig:sig 属性包含由认证器生成的数字签名。此签名用于验证认证声明的真实性。
  • ver:ver 属性指定认证声明格式的版本。
  • x5c:x5c 数组包含一个或多个构成认证路径的 X.509 证书,这有助于验证认证。
  • pubArea:pubArea 属性包含有关公钥和认证器特征的详细信息。
  • certInfo:certInfo 属性通常包含有关受信任方对认证器进行认证的信息。

clientDataJSON#

"clientDataJSON": { "type": "webauthn.create", "challenge": "AAABeB78HrIemh1jTdJICr_3QG_RMOhp", "origin": "https://www.passkeys-debugger.io", "crossOrigin": false }

相应的词汇表文章中阅读更多关于 clientDataJSON 的信息。

transports#

"transports": [ "hybrid", "internal" ]

transports 属性指示认证器可以与客户端通信的机制。一些常见的示例值组合是:

  • "transports": ["internal","hybrid"]:密钥可以从平台认证器(例如 Face ID、Touch ID、Windows Hello)或通过跨设备身份验证(使用二维码和蓝牙)使用。
  • "transports": ["internal"]:密钥可以从平台认证器(例如 Face ID、Touch ID、Windows Hello)使用。
  • 未设置 transports 属性:默认行为,不提供任何指示。

认证常见问题解答#

为什么认证在 WebAuthn 中至关重要?#

WebAuthn 中的认证(认证声明)非常重要,因为它提供了认证器真实性的证明。它确保身份验证过程由受信任的设备执行,从而防范潜在的安全威胁。

Ben Gould Testimonial

Ben Gould

Head of Engineering

I’ve built hundreds of integrations in my time, including quite a few with identity providers and I’ve never been so impressed with a developer experience as I have been with Corbado.

超过 3000 名开发者信任 Corbado,并使用密钥让互联网更安全。有疑问吗?我们撰写了超过 150 篇关于密钥的博客文章。

加入 Passkeys 社区

密钥的引入是否改变了认证的角色?#

是的,由于密钥可以在设备间同步(例如,通过 Keychain 从 iPhone 同步到 MacBook),信赖方无法再真正确定是哪个经过认证的设备正在登录应用或网站。因此,苹果和谷歌决定,对于同步的密钥,他们将不再提供认证声明。然而,为了改善信赖方的用户体验,并让他们有机会识别和显示来自苹果和谷歌生态系统(iCloud 钥匙串谷歌密码管理器)的密钥,AAGUID 仍将提供(只要在 WebAuthn 服务器设置中将 PublicKeyCredentialCreationOptions 的认证设置为 directindirect)。详情请参阅此 GitHub 问题

对于密钥,推荐的认证偏好设置是什么?#

如果您想在您的网站和应用中集成密钥认证,并希望为您的用户提供出色的密钥用户体验,您应该考虑以下几点。我们假设您主要为大多数用户使用 Windows、iOS、macOS 或 Android 操作系统的场景构建解决方案。此外,我们假设大多数密钥(除了 Windows)都是同步密钥。由于 iOS、macOS 和 Android 都不再发送认证声明,因此对认证器的真正验证已不再使用(对于 Windows 这仍然有效,可能是因为 Windows 尚未通过 Windows Hello 提供同步密钥)。然而,为了获取 AAGUID,例如为了在账户设置中更好地管理密钥,我们建议将认证偏好设置为 indirect,因为这样仍然可以获取 AAGUID,而认证声明则根据情况发送(Windows)或不发送(iOS、macOS、Android)。

认证与 FIDO 元数据服务之间有什么联系?#

FIDO元数据服务为各种认证器提供了一个元数据存储库。在认证期间,可以查询此服务以获取和验证有关认证器的详细信息,从而确保准确性并增强过程的可信度。FIDO元数据服务检查的是认证声明(而非认证对象)。

直接认证是否存在隐私问题?#

是的,直接认证(在认证声明中)虽然通过提供有关设备的详细信息来提供最高的透明度,但在某些情况下可能会引发隐私问题。在选择认证类型时,评估透明度与隐私需求之间的权衡至关重要。

WebAuthn 如何在认证期间确保用户隐私?#

WebAuthn 提供了不同类型的认证偏好——无、间接、直接和企业。对于用户隐私很重要的场景,可以采用 attestation=none,它不提供有关设备的任何详细信息,从而确保用户的隐私受到保护。

Add passkeys to your app in <1 hour with our UI components, SDKs & guides.

Start for free

Share this article


LinkedInTwitterFacebook

Enjoyed this read?

🤝 Join our Passkeys Community

Share passkeys implementation tips and get support to free the world from passwords.

🚀 Subscribe to Substack

Get the latest news, strategies, and insights about passkeys sent straight to your inbox.

Related Terms