从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.create
和navigator.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。