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

本文详细介绍了从U2F安全密钥到现代Passkeys认证技术的演进历程,涵盖CTAP协议、WebAuthn标准、FIDO2生态系统以及混合认证等核心技术架构,解析了密码学签名、用户验证和凭证管理等关键技术实现。

从U2F到Passkeys

引言

在过去十多年间,一系列标准逐渐发展为Passkeys——一种有望替代密码的认证方案。这些技术在发展过程中积累了相当复杂性,本文按时间顺序阐述这些核心技术的发展历程。所有内容均来自已发布的标准文档,但阅读这些标准并理解其整体架构仍具挑战性。

开端:U2F

U2F代表"通用第二因素",包含两个标准:一个是计算机与称为安全密钥的可移动设备通信的协议,另一个是网站使用这些设备的JavaScript API。第一个标准也称为客户端到认证器协议(CTAP1),而现已过时的JavaScript API通常被称为"U2F API"。

U2F的目标是消除用户认证中的"持有者令牌"。持有者令牌是认证领域的术语,指任何用于证明身份的密钥。密码是最常见的例子,它之所以是持有者令牌,是因为通过披露它来证明身份,前提是其他人不知道这个密钥。

数字签名优于持有者令牌,因为可以通过签名证明拥有私钥,而无需披露私钥本身。因此U2F允许在Web认证中使用签名。

创建凭证

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

CTAP1创建凭证请求结构包含两个重要哈希值:客户端数据哈希和AppID哈希。客户端数据是由浏览器构建的JSON结构,安全密钥在其签名输出中包含此哈希,允许浏览器(或操作系统)将数据放入签名消息中。

注册响应

U2F安全密钥创建凭证后的响应包含:公共密钥、凭证ID、X.509证明证书和ECDSA签名。公共密钥是新创建凭证的公钥,U2F始终使用P-256曲线和SHA-256的ECDSA。

无状态设计

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

获取断言

“断言"是来自凭证的签名。CTAP1断言请求结构与凭证创建类似,包含客户端数据和AppID哈希。安全密钥将尝试解密凭证ID并验证AppID哈希。

传输方式

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

FIDO2

U2F生态系统满足了第二因素认证的需求,但要消除密码还需要更多工作。因此开始开发新的安全密钥协议CTAP2,同时更新Web API,最终成为W3C的"Web认证"规范(WebAuthn)。CTAP2和WebAuthn共同构成了FIDO2工作。

可发现凭证

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

用户验证

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

RP ID

FIDO2用"依赖方ID”(RP ID)取代了AppID。AppID是URL,而RP ID是纯域名。否则,RP ID的用途与CTAP1中的AppID相同。

CTAP协议变更

除了上述高级语义变更外,CTAP2的语法与U2F完全不同。它使用CBOR而不是具有固定或临时字段长度的二进制协议。

WebAuthn

作为FIDO2工作的一部分,WebAuthn API被完全替换。WebAuthn集成到W3C凭证管理规范中,通过navigator.credentials.create和navigator.credentials.get在JavaScript中调用。

其他认证器类型

WebAuthn不要求所有认证器都是安全密钥。任何能够正确格式化消息的设备都可以是认证器,因此笔记本电脑和台式机本身可以是认证器。这些设备称为"平台认证器”。

caBLE / 混合

虽然平台认证器非常适合在同一计算机上重新认证,但它们永远无法在不同的计算机上登录。caBLEv2被设计为使用最少的蓝牙:从手机发送到桌面的单个广告。这意味着其余通信通过互联网进行。

WebAuthn系列API

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

Passkeys

通过混合和平台认证器,人们可以广泛访问WebAuthn认证器。但如果你重置或丢失手机/笔记本电脑,仍然会丢失所有凭证,就像重置或丢失安全密钥一样。

“更好"必须意味着"可恢复”。人们确实会丢失和重置手机,因此FIDO的一个迄今神圣的属性必须放宽,以便将其范围扩展到企业和专家之外:私钥必须备份。

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

人们现在可以普遍访问认证器,能够使用它们跨设备断言凭证,并有合理保证可以恢复这些凭证。为了将其捆绑在一起并赋予更友好的名称,Apple引入了更好的品牌:Passkeys。

未来

Passkeys的初始启动没有任何第三方密码管理器的规定。在iOS和macOS上,必须使用iCloud钥匙串,在Android上必须使用Google密码管理器。这是权宜之计,但从来不是预期的最终状态,随着iOS 17和Android 14,第三方密码管理器可以保存和提供Passkeys。

在2023年撰写本文时,大部分工作正在构建我们已勾勒的生态系统。Passkeys需要同步到更多地方,第三方密码管理器支持需要充实。

然而,有许多主题即将出现。随着FIDO2、CTAP和WebAuthn,我们要求网站更加信任密码管理器。虽然密码管理器长期存在,但使用远非普遍。但通过FIDO2的设计,用户必须使用密码管理器。

接下来,RP ID的概念是Passkeys的核心,但它是一个以Web为中心的概念。有些服务是仅移动端的,没有以域名形式的强大品牌。但Passkeys永远与RP ID关联,这迫使应用程序承诺可能出现在UI中的域名。

RP ID的目的是阻止凭证在网站之间共享,从而成为跟踪向量。但现在我们有了更精细的UI,也许可以向用户显示使用凭证的地方,并让RP ID成为公钥哈希或其他不绑定DNS的东西。

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

有一大堆标有"试图取代密码"的尸体。Passkeys是迄今为止最好的尝试。希望五年后,它们不会成为警示故事。

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