首页
/ Web Authentication API 详解:现代无密码认证技术指南

Web Authentication API 详解:现代无密码认证技术指南

2025-07-07 02:35:37作者:董斯意

什么是 Web Authentication API?

Web Authentication API(简称 WebAuthn)是现代浏览器提供的一套基于公钥密码学的强身份验证标准,它允许网站实现无密码登录和安全的多因素认证(MFA)。作为 Credential Management API 的扩展,WebAuthn 通过消除传统密码带来的安全隐患,为用户提供了更安全便捷的认证体验。

核心优势

WebAuthn 相比传统密码认证具有三大核心优势:

  1. 防钓鱼攻击:由于签名会随网站来源变化,攻击者无法通过伪造登录页面窃取用户凭证
  2. 降低数据泄露影响:服务器仅存储公钥,即使泄露也无法用于认证
  3. 抵御密码攻击:数字签名比传统密码更难被暴力猜测,且不存在密码重用问题

关键技术概念

非对称加密基础

WebAuthn 基于公钥密码学体系:

  • 注册时:生成密钥对,公钥发送给服务器,私钥保存在认证器
  • 登录时:使用私钥签名挑战字符串,服务器用公钥验证

认证器类型

认证器(Authenticator)是执行加密操作的硬件或软件模块,分为:

  • 平台认证器:集成在设备中(如 Windows Hello、Touch ID)
  • 跨平台认证器:独立物理设备(如 YubiKey)

完整工作流程

用户注册流程

  1. 服务器准备阶段

    • 生成随机挑战值(至少16字节)
    • 准备用户和依赖方信息
  2. 客户端调用创建凭证

    const credential = await navigator.credentials.create({
      publicKey: {
        challenge: new Uint8Array([...]), // 服务器生成的随机数
        rp: { id: "example.com", name: "示例网站" },
        user: {
          id: new Uint8Array([...]), // 用户唯一标识
          name: "user@example.com",
          displayName: "张三"
        },
        pubKeyCredParams: [{ type: "public-key", alg: -7 }] // 支持的算法
      }
    });
    
  3. 认证器生成密钥对

    • 获得用户同意(如生物识别)
    • 创建新密钥对并返回公钥
  4. 服务器验证与存储

    • 验证挑战值匹配性
    • 检查来源有效性
    • 存储公钥与用户关联

用户认证流程

  1. 服务器发起挑战

    • 生成新挑战值
    • 可选指定允许的凭证列表
  2. 客户端获取断言

    const assertion = await navigator.credentials.get({
      publicKey: {
        challenge: new Uint8Array([...]), // 新挑战值
        rpId: "example.com",
        userVerification: "preferred" // 验证级别
      }
    });
    
  3. 认证器生成签名

    • 用户选择凭证
    • 使用私钥签名挑战值
  4. 服务器验证断言

    • 用存储的公钥验证签名
    • 确认挑战值匹配
    • 检查来源有效性

高级特性:可发现凭证

核心概念

可发现凭证(Discoverable Credentials)允许:

  • 凭证元数据(如用户名)存储在认证器中
  • 无需服务器预先提供凭证ID即可登录
  • 支持表单自动填充式登录体验

实现方式

  1. 注册时标记为可发现

    publicKey: {
      // ...其他参数
      authenticatorSelection: {
        residentKey: "required" // 要求可发现凭证
      }
    }
    
  2. 登录时使用条件式验证

    const credential = await navigator.credentials.get({
      mediation: "conditional", // 条件式验证
      publicKey: {
        challenge: new Uint8Array([...]),
        rpId: "example.com",
        allowCredentials: [] // 空数组表示仅使用可发现凭证
      }
    });
    
  3. HTML自动完成提示

    <input type="text" name="username" autocomplete="webauthn">
    

凭证同步机制

当服务器与认证器数据不一致时,可使用:

  • signalAllAcceptedCredentials():同步全部有效凭证
  • signalCurrentUserDetails():更新用户信息
  • signalUnknownCredential():移除无效凭证

客户端能力检测

通过 getClientCapabilities() 检测浏览器支持情况:

const capabilities = await PublicKeyCredential.getClientCapabilities();
if (capabilities.userVerifyingPlatformAuthenticator) {
  // 支持生物识别认证器
}

安全策略控制

通过权限策略限制API使用:

Permissions-Policy: publickey-credentials-create=*, publickey-credentials-get=*

实际应用建议

  1. 渐进式增强:作为传统认证的补充
  2. 用户体验优化:清晰引导用户使用生物识别
  3. 错误处理:提供备用认证方式
  4. 审计日志:记录所有认证事件

WebAuthn 代表了认证技术的未来方向,通过合理实施可以显著提升系统安全性同时改善用户体验。开发者应根据目标用户群体和设备支持情况,设计适当的认证策略。