使用 WebAuthn 启用增强型身份验证

问题

钓鱼式攻击是网络上的首要安全问题:去年,81% 的与黑客相关的帐号遭到入侵都是利用安全系数低或被盗的密码。业界对这一问题的集体行动一直是多重身份验证,但各实现方法各不相同,而且大部分都不能充分解决钓鱼式攻击问题。 自 2013 年以来,我们一直与 FIDO 联盟合作,最近与 W3C 合作,实现了可供任何 Web 应用使用的标准化防钓鱼式攻击协议。

什么是 WebAuthn?

Web Authentication API 允许 Web 应用通过用户代理通过身份验证器访问身份验证器(通常是通过 USB/BLE/NFC 访问的硬件令牌或直接内置于平台中的模块),以便生成和质询应用作用域 (eTLD+k) 公钥凭据。这支持各种用例,例如:

  • 顺畅体验且能防范钓鱼式攻击的 2FA(与密码结合使用)。
  • 基于生物识别技术的无密码重新授权。
  • 顺畅体验,可防范钓鱼式攻击,无需密码(用于无密码帐号)。

大多数主流浏览器正在按照相关进度对该 API 进行实现,这既是为了简化必须在线验证身份时遇到的界面,也用于显著减少钓鱼式攻击。

WebAuthn 扩展了凭据管理 API,并添加了一种名为 PublicKeyCredential 的新凭据类型。WebAuthn 将浏览器与身份验证器之间的通信抽象化,并允许用户执行以下操作:

  1. 为网站创建并注册公钥凭据。
  2. 通过证明拥有相应私钥来对网站进行身份验证。

身份验证器是可以生成私钥/公钥对并征求用户意见的设备。您可以通过简单点按、成功指纹读取或其他方法就签名征得用户同意,只要这些方法符合 FIDO2 要求即可(FIDO 联盟有一个面向身份验证器的认证计划)。身份验证器可以内置于平台中(如智能手机上的指纹扫描器),也可以通过 USB、蓝牙低功耗 (BLE) 或近距离无线通信 (NFC) 连接。

运作方式

创建密钥对并注册用户

当用户想要向网站注册凭据(WebAuthn 将其称为“依赖方”)时:

  1. 依赖方生成质询。
  2. 依赖方通过 Credential Manager API 要求浏览器为依赖方生成新的凭据,并指定设备功能,例如,设备是否提供自己的用户身份验证(通过生物识别等)。
  3. 在身份验证器征得用户同意后,身份验证器会生成一个密钥对,并将公钥和可选的签名认证返回给网站。
  4. Web 应用将公钥转发到服务器。
  5. 服务器将公钥与用户身份一起存储,以记住凭据以用于将来的身份验证。
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

对用户进行身份验证

如果网站需要获得证据以证明它正在与正确的用户互动,请执行以下操作:

  1. 依赖方生成质询,并向浏览器提供向用户注册的凭据列表。它还可以指明在哪里查找凭据,例如在本地内置身份验证器上,还是在通过 USB、BLE 等的外部设备上。
  2. 浏览器要求身份验证器对质询进行签名。
  3. 如果身份验证器包含某个给定凭据,则会在征得用户同意后向 Web 应用返回一个已签名的断言。
  4. Web 应用将已签名的断言转发给服务器,以供依赖方进行验证。
  5. 服务器完成验证后,身份验证流程被视为成功。
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

访问 https://webauthndemo.appspot.com/ 并亲自尝试 WebAuthn。

前面是什么?

Chrome 67 Beta 版支持 navigator.credentials.get({publicKey: ...})navigator.credentials.create({publicKey:... }),并支持在桌面设备上通过 USB 传输使用 U2F/CTAP 1 身份验证器。

即将发布的版本将添加对更多传输方式的支持,例如 BLE 和 NFC,以及较新的 CTAP 2 有线协议。我们还在开发由 CTAP 2 和 WebAuthn 启用的更高级流程,例如受 PIN 码保护的身份验证器、在本地选择帐号(而不是输入用户名或密码)和指纹注册。

请注意,Microsoft Edge 也支持该 API,并且 Firefox 自 Firefox 60 起便支持 WebAuthn

资源

我们正在编写更详细的文档:

2018 年 Google I/O 大会上的“What's new with sign-up and sign-in the web”(网络上注册和登录的新变化)介绍了 WebAuthn。