1. FIDO与U2F
FIDO(Fast IDentity Online联盟)是一个基于标准、可互操作的身份认证生态系统。
U2F(Universal 2nd Factor)是FIDO联盟提出的使用标准公钥密码学技术提供更强有力的身份认证协议。
U2F在常用的用户名/密码的认证基础上又增加了一层第二因子(2nd Factor)的保护,这重保护是通过物理硬件来支持的。
2. U2F协议原理
FIDO的官方网站用两张图介绍了U2F的应用原理,它把应用过程分解为两个阶段:
注册阶段,如图1所示:

图1中的流程如下:
- 客户端提示用户选择符合在线服务策略的可用 的U2F设备。
- 用户使用U2F设备上的按钮解锁 U2F设备。
- U2F设备创建一对针对本地设备、在线服务和用户账户的独有的全新公/私钥对。
- 客户端将公钥发送给在线服务,并将其与用户的账户关联,私钥存放在U2F设备中。
鉴权阶段,如图2所示:

图2中的流程如下:
- 在线服务要求用户使用之前注册使用的U2F设备登录。
- 用户使用U2F设备上的按钮解锁 U2F设备。
- 设备使用由服务器提供的用户的账户标识来选择正确的密钥并签名服务器发出的挑战值。
- U2F设备将经过签名的挑战发送回服务器,由其使用存储的公钥进行验证,服务器验证成功后允许用户登录。
U2F的原理很简单:用户需要使用用户名/口令、客户端设备(物理设备)两重安全因子完成在线服务网站的注册与登录鉴权工作;用户在向在线服务注册期间,用户的客户端设备会创建一个新的密钥对。该设备保留私钥,并向在线服务注册公钥;用户在登录鉴权期间,客户端通过对挑战值签名的方式向该服务证明私钥的拥有权,以此完成身份认证。其实这与我们日常使用的网上银行登录时需要插入USB Key没有什么区别,可能唯一的技术差别在于浏览器在识别银行的USB Key使用的是特定的插件,而对于U2F设备,浏览器已经内置了识别接口。
3. U2F协议的消息格式
U2F协议支持两个操作:注册(registration)与鉴权(authentication),这两个操作可分解为三个阶段,如图3所示。

在图3中,Relying Party(简称RP)就是第2节描述的在线服务网站。FIDO Client为客户端,三个阶段的流程如下:
- Setup:在这个阶段,客户端向在线服务网站请求一个挑战值,客户端使用这个挑战值生成一个请求消息发送到U2F设备。
- Processing:在这个阶段,U2F设备针对请求消息做一些密码学的操作,并创建回应消息。
- Verification:在这个阶段,客户端将U2F设备的回应消息交给服务端进行验证,服务端处理回应消息并验证其正确性。对于一个正确的注册回应使得服务端为用户注册一个公钥;对于一个正确的鉴权回应使得服务端相信用户拥有一个正确的私钥以通过身份认证。
FIDO提供了HID协议实现浏览器与U2F设备(使用USB接口)之间的消息通讯,协议细节可参见对应定义文档。
下面我们了解一下浏览器与U2F设备之间的数据帧格式。
3.1. 注册请求消息
注册请求消息如图4所示:

消息中各字段含义如下: