什么是Webauthn?

WebAuthn(Web 身份验证)是由万维网联盟(W3C)发布的 Web 标准。WebAuthn 是 FIDO 联盟指导下的 FIDO2 项目的核心组成部分。该项目的目标是标准化用户对基于 Web 的应用程序和服务的公钥认证的接口。

WebAuthn全称Web Authentication API 使用asymmetric (public-key) cryptography (不对称加密)替代密码或SMS文本在网站上注册,验证, second-factor authentication(双因素验证). 解决了phishing(钓鱼), data breaches(数据破坏), SMS 文本攻击,其他双因素验证等重大安全问题. 同时显著提高易用性(因为用户不必管理许多越来越复杂的密码)。

WebAuthn支持的生物验证方式包括:笔记本电脑的指纹识别和面部识别、安卓设备的指纹识别。追求高安全的用户还可额外购买兼容FIDO的实体安全密钥,FIDO完整支持包括:指纹识别、面部识别、虹膜识别、声音识别、实体密钥(USB连接、蓝牙连接、NFC连接),支持设备系统包括:Windows 10、Linux、Mac OS、Android、iOS、智能手表等。

支持系统和浏览器包括:

Windows:Edge,Firefox,Chrome

Linux :Firefox,Chrome

MacOS :Safari,Firefox,Chrome

Android:Firefox,Chrome

iOS :Brave,Firefox,Chrome

Windows上的Microsoft Edge,使用Windows Hello(带面部识别,指纹识别器或PIN)

MacOS上的Chrome使用Touch ID指纹识别器

Android上的Chrome,使用指纹识别器

Webauthn的架构实现

WebAuthn用公钥证书代替了密码,完成用户的注册和身份认证(登录)。它更像是现有身份认证的增强或补充。为了保证通信数据安全,一般基于HTTPS(TLS)通信。在这个过程中,有4个模块。

Server(服务端):

它可以被认为一个依赖方(Relying Party),它会存储用户的公钥并负责用户的注册、认证。

JavaScript(Js脚本):

调用浏览器API,与Server进行通信,发起注册或认证过程。

Browser(浏览器):

需要包含WebAuthn的Credential Management API提供给js调用,还需要实现与认证模块进行通信,由浏览器统一封装硬件设备的交互。

Authenticator(认证模块):

它能够创建、存储、检索身份凭证。它一般是个硬件设备(智能卡、USB,NFC等),也可能已经集成到了你的操作系统(比如Windows Hello,MacOS的Touch ID等)

认证流程

1)应用请求注册

应用程序发出注册请求,服务端提供api由前端js调用发起注册请求;

2)服务端返回注册数据

服务器将挑战码、用户信息和依赖方信息发送回应用程序。

challenge:挑战码必须是随机的 buffer(至少 16 字节),并且必须在服务器上生成以确保安全。

user info:用户信息,服务端需要知道当前谁来注册,正常应用场景中,第一步需要在其他辅助认证的情况下获取当前合法用户信息,比如第一步传输静态用户名密码来做一次校验,服务器认可当前是一个合法用户请求注册;

relying party info:服务端上下文,包含AuthenticatorAttestationResponse 的 PublicKeyCredential

3)浏览器调用认证器

请求认证器创建认证证书,浏览器生成客户端数据(clientData)生成clientDataHash(由挑战码,服务端上下文 的 SHA-256 哈希)传输给认证器;

4)认证器创建密钥对

认证器通常会以某种形式要求用户确认密钥器的所属,如输入 PIN,使用指纹,进行虹膜扫描等,以证明用户在场并同意注册。验证通过后,认证器将创建一个新的非对称密钥对,并安全地存储私钥以供将来验证使用。公钥则将成为证明的一部分,被在制作过程中烧录于认证器内的私钥进行签名。这个私钥会具有可以被验证的证书链。

5)认证器数据返回浏览器

返回数据包括新的公钥、全局唯一的凭证ID和认证凭证数据(Attestation object l包含FIDO的元数据)会被返回到浏览器。

6)浏览器打包数据,发送到服务端

包含公钥,全局唯一的凭证ID、认证凭证数据、客户端数据(clientData);其中认证凭证数据包含了clientDataHash,可以确定当前生成的公钥是分配给当前请求注册的用户。

7)服务端完成注册

收到客户端发送的注册请求,服务器需要执行一系列检查以确保注册完成且数据未被篡改。步骤包括:

a.验证接收到的挑战与发送的挑战相同

b.确保 origin 与预期的一致

c.使用对应认证器型号的证书链验证 clientDataHash 的签名和验签

验证步骤的完整列表可以在 WebAuthn 规范中找到。一旦验证成功,服务器将会把新的公钥与用户账户相关联以供将来用户希望使用公钥进行身份验证时使用。

认证流程

1)应用请求认证

应用程序发出注册请求,服务端提供api由前端js调用发起注册请求;

2)服务端返回挑战码

挑战码必须是随机信息(例如超过100字节)的大缓冲区,并且必须在服务器上生成挑战码,以确保身份验证过程的安全。

3)浏览器调用认证器

浏览器生成客户端数据(clientData)生成clientDataHash(由挑战码,服务端上下文 的 SHA-256 哈希)传输给认证器。

4)认证器创建断言

认证器提示用户进行身份认证(如输入 PIN,使用指纹,进行虹膜扫描等),并通过在注册时保存的私钥对clientDataHash和认证数据进行签名创建断言。

5)认证器数据返回浏览器

返回认证数据和签名到浏览器。

6)浏览器打包数据,发送到服务端

包含客户端数据(clientData)、认证数据和签名到浏览器。

7)服务端完成注册

收到浏览器发送的认证请求,服务器需要执行一系列检查以确保认证完成且数据未被篡改,步骤包括:

a.使用注册请求期间存储的公钥验证身份验证者的签名。

b.确保由身份验证程序签名的挑战码与服务器生成的挑战码匹配。

c.检查账号信息,是否是服务端的存在的账号。

在WebAuthn规范中可以找到验证断言的完整步骤列表。假设验证成功,服务器将注意到用户现在已通过身份验证。这超出了WebAuthn规范的范围,但有一个选项是为用户会话删除一个新的cookie。

Webauthn的应用场景

Webauthn提供了一个安全的无密码认证标准,彻底抛弃了密码,并且统一由操作系统完成安全硬件设备和生物特征识别的集成及管理,浏览器调用操作系统进行提供的能力形成认证器,应用开发者按标准与浏览集成即可完成FIDO认证,无需关心硬件设备的兼容和生物特征的算法,使得应用开发者集成FIDO认证抛弃密码更加容易和安全。

场景一:集成Windows hello认证

Win10系统的Windows hello模块,本身可以集成人脸、指纹、pin码等认证方式,在windows上运行的web应用注册或认证时可以通过浏览器直接与windows hello集成获取用户身份凭证进行认证;

场景二:集成MacOS Touch ID认证

MacBook系统自带Touch ID集成指纹认证,浏览器通过接口可以直接唤醒mac的Touch ID进行认证;支持Webauthn的web应用可以直接使用TouchID进行登录;

场景三:集成Android指纹认证

由于Android系统厂商的异构,不同手机厂商会有不同的人脸识别或指纹识别模块,通过Webauthn由系统层面封装了与生物设备对接,应用系统就无需关心Android系统的异构行,直接使用手机的生物认证登录;

场景四:集成iOS人脸认证

iPhone系统自带Face ID集成人脸认证,浏览器通过接口可以直接唤醒Face ID进行认证;支持Webauthn的web应用可以直接使用Face ID进行登录;

场景五:使用YubiKey认证

YubiKey是一个外置的ukey存储用户私钥来进行webauthn认证,其可以同时支持pc和移动app;pc模式下通过usb接口访问,移动app模式下通过nfc访问;

Webauthn存在的缺点

Webauthn依赖于浏览器与认证模块通讯,那么必须使用最新的浏览方可支持。在无浏览器情况下如CS应用或移动APP无法简便的使用;

Webauthn设计的目标是解决认证,用户一旦通过认证,就可以访问所有资源,在零信任架构中不能允许一次认证永久使用的场景存在。

身份安全|什么是Webauthn?
标签: