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

问题

钓鱼式攻击是网络上最严重的安全问题:81% 的黑客相关账号都属于安全问题 利用安全系数低或被盗的密码。业界同仁 多重身份验证,但是 各种实施方式都非常分散,而且大部分实施方式仍无法充分解决钓鱼式攻击问题。 从那时起,我们就一直与 FIDO 联盟合作, 2013 年,最近与 W3C 合作,实施了 任何 Web 应用都可以使用的防范钓鱼式攻击的协议。

什么是 WebAuthn?

Web Authentication API 为 Web 通过用户代理中介的应用、验证器的访问,通常 通过 USB/BLE/NFC 访问的硬件令牌,或直接内置于 用于生成应用级范围的容器并对其进行质疑 (eTLD+k) 公钥凭据。这支持各种用例,例如:

  • 顺畅的防钓鱼式攻击 2FA(与 密码)。
  • 无密码、基于生物识别技术的重新授权。
  • 流畅的双重身份验证和防钓鱼式攻击,无需密码(仅在使用 (针对无密码账号)。

该 API 预计将在大多数主流浏览器中实现,旨在用于实现以下目的: 既能简化需要在线验证身份时遇到的界面, 大大减少钓鱼式攻击

WebAuthn 扩展了 Credential Management 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",
}});

前往以下网址自行试用 WebAuthn: https://webauthndemo.appspot.com/.

接下来是什么?

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 60 开始,Firefox 可支持 WebAuthn

资源

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

专题演讲“网页版注册和登录的新变化” Google I/O 2018 上介绍了 WebAuthn。