概述WebAuthn 结合平台/跨平台认证器(Passkeys)实现无密码登录,降低钓鱼与凭证泄露风险。本文给出注册与认证流程、关键参数与验证方法。关键安全参数(已验证)RP ID:必须等于有效域名的注册域(如 `example.com`),并与页面 `origin` 同源。Challenge:服务端生成的随机不可预测值(≥ 16 字节),一次性,短期有效。User Verification:要求强验证(`required`)以确保本地生物特征或 PIN。Attestation:一般使用 `none` 降低隐私风险;需要设备证明时审慎启用并校验证书链。注册(Credential Creation)流程要点服务端下发 `PublicKeyCredentialCreationOptions`:包含 `rp`, `user`, `challenge`, `pubKeyCredParams`。客户端调用 `navigator.credentials.create`,返回公钥与元数据;服务端验证:`clientDataJSON.origin` 与 `type`,`challenge` 匹配,`authenticatorData` 的 `rpIdHash`,以及签名与计数器。认证(Assertion)流程要点服务端下发 `PublicKeyCredentialRequestOptions`(含 `challenge` 与允许的 `credentialIds` 或可发现凭证);客户端调用 `navigator.credentials.get`;服务端验证:`clientDataJSON`、`authenticatorData.signCount` 防重放、签名校验与用户验证标志位。示例(伪配置){ "rp": { "id": "example.com", "name": "Example" }, "user": { "id": "base64(userId)", "name": "alice", "displayName": "Alice" }, "challenge": "random-128bit", "pubKeyCredParams": [{ "type": "public-key", "alg": -7 }], "authenticatorSelection": { "userVerification": "required", "residentKey": "preferred" }, "attestation": "none" } 验证与监控记录注册与认证失败原因(挑战过期、来源不匹配、签名校验失败);统计可发现凭证使用率与跨设备可用性;风险事件(设备变更/撤销)触发凭证无效化与二次验证。常见误区`rp.id` 与页面 `origin` 不匹配导致认证失败;`challenge` 可预测或复用造成重放风险;不校验 `signCount`,无法检测克隆设备或重放。结语遵循 RP/Origin/Challenge 校验与用户验证要求,并建立失败原因与撤销机制,WebAuthn/Passkeys 能在生产环境实现可靠的无密码登录。

发表评论 取消回复