从U2F到Passkeys:Web认证技术的演进之路

本文详细追溯了从U2F安全密钥到现代Passkeys的技术发展历程,涵盖CTAP协议、WebAuthn标准、FIDO2生态系统等核心认证技术架构及其演进过程。

从U2F到Passkeys:Web认证技术的演进

引言

在过去十多年间,一系列标准逐渐发展成为passkeys——一种有望替代密码的认证方案。这些技术在发展过程中积累了相当的复杂性,本文按时间顺序梳理了这些核心技术的发展历程。

开端:U2F

U2F代表"通用第二因素",包含两个标准:一个是计算机与称为安全密钥的小型可移动设备通信的协议,另一个是网站使用这些设备的JavaScript API。

U2F的目标是消除用户认证中的"持有者令牌"。持有者令牌是指任何用于证明身份的传递秘密,密码是最常见的例子。

创建凭证

CTAP1仅包含两个命令:创建凭证和从凭证获取签名。网站使用U2F JavaScript API发出请求,浏览器将其转换为CTAP1命令。

CTAP1创建凭证请求结构:

  • 命令代码:0x01(注册)
  • 标志位:始终为零
  • 数据长度:始终为64
  • 客户端数据哈希:32字节SHA-256哈希
  • AppID哈希:32字节SHA-256哈希

注册响应

U2F安全密钥创建凭证后的响应包含:

  • 保留字节:始终为0x05
  • 公钥:65字节未压缩X9.62格式
  • 凭证ID长度
  • 凭证ID
  • X.509证明证书
  • ECDSA签名

无状态设计

大多数U2F安全密钥在创建凭证时实际上不存储任何内容。返回的凭证ID实际上是加密的种子,安全密钥可以根据需要重新生成私钥。

获取断言

“断言"是来自凭证的签名。CTAP1断言请求结构包含:

  • 命令代码:0x02(获取断言)
  • 标志位
  • 数据长度
  • 客户端数据哈希
  • AppID哈希
  • 凭证ID长度
  • 凭证ID

传输方式

大多数安全密钥是USB设备,在USB总线上显示为人机接口设备。支持NFC的安全密钥也很常见,使用NFC时不需要触摸传感器。蓝牙安全密钥通过GATT协议工作。

FIDO2

FIDO2包括新的安全密钥协议CTAP2和更新的Web API——WebAuthn。

可发现凭证

U2F凭证称为"不可发现"凭证,使用它们需要知道其凭证ID。“可发现"凭证是安全密钥可以自行找到的凭证,因此它们也可以替代用户名。

用户验证

FIDO2具有称为"用户验证"的升级版用户存在形式。不同的安全密钥可以以不同方式验证用户,最基本的方法是在计算机上输入PIN并发送到安全密钥。

RP ID

FIDO2用"依赖方ID”(RP ID)取代了AppID。AppID是URL,而RP ID是纯域名。

CTAP协议变更

CTAP2的语法与U2F完全不同,使用CBOR而不是具有固定或临时字段长度的二进制协议。

WebAuthn

WebAuthn集成到W3C凭证管理规范中,通过navigator.credentials.createnavigator.credentials.get在JavaScript中调用。

其他类型的认证器

除了安全密钥,WebAuthn不要求所有认证器都是安全密钥。笔记本电脑和台式机本身可以是认证器,这些设备称为"平台认证器”。

caBLE / 混合

云辅助BLE(caBLE)允许人们将手机用作认证器,而无需蓝牙配对。caBLEv2设计为使用最少的蓝牙:从手机发送到桌面的单个广播。

WebAuthn系列API

WebAuthn是一个Web API,但人们有时也在Web浏览器之外使用计算机和手机。虽然这些上下文不能使用WebAuthn本身,但出现了一些类似于WebAuthn的本机应用API。

Passkeys

通过混合和平台认证器,人们可以广泛使用WebAuthn认证器。但如果你重置或丢失手机/笔记本电脑,仍然会丢失所有凭证。

2021年,随着iOS 15,Apple包含了将WebAuthn私钥保存到iCloud钥匙串的功能。2022年底,iOS 16添加了对混合的支持,在Android上,Google密码管理器添加了备份和同步私钥的支持。

未来

passkeys的初始启动没有为第三方密码管理器提供任何规定。在iOS 17和Android 14中,第三方密码管理器可以保存和提供passkeys。

我们需要考虑用户在生态系统之间过渡的问题。人们从Android切换到iOS,反之亦然,他们应该能够随身携带passkeys。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计