FIDO U2F应用与开发(一)-原理与协议

1. FIDO与U2F

  FIDO(Fast IDentity Online联盟)是一个基于标准、可互操作的身份认证生态系统。
  U2F(Universal 2nd Factor)是FIDO联盟提出的使用标准公钥密码学技术提供更强有力的身份认证协议。
  U2F在常用的用户名/密码的认证基础上又增加了一层第二因子(2nd Factor)的保护,这重保护是通过物理硬件来支持的。

2. U2F协议原理

  FIDO的官方网站用两张图介绍了U2F的应用原理,它把应用过程分解为两个阶段:
  注册阶段,如图1所示

图1

  图1中的流程如下:

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

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

3. U2F协议的消息格式

  U2F协议支持两个操作:注册(registration)与鉴权(authentication),这两个操作可分解为三个阶段,如图3所示。


图3

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

3.1. 注册请求消息

  注册请求消息如图4所示:


图4

  消息中各字段含义如下:

  • challenge parameter [32 bytes]:是对由挑战值组成的Client Data(后面会介绍,客户端生成的一个JSON字符串)使用SHA-256算法得到32位摘要。
  • application parameter [32 bytes]:对使用UTF-8编码的应用ID(application identity)使用使用SHA-256算法得到32位摘要。

3.2. 注册回应消息

  注册回应消息如图5所示:


图5

消息中字段含义如下:

  • reserved byte [1 byte]:固定值0x05。
  • user public key [65 bytes]:65字节的公钥。
  • key handle length byte [1 byte]:key handle用于定位私钥,这里使用1字节表示长度。
  • key handle [length specified in previous field]:key handle的值。
  • attestation certificate [variable length]:使用X.509 DER格式的证书(有点类似于厂商提供的根证书),其中的公钥用于验证后面的签名。
  • signature [variable length, 71-73 bytes]:使用ECDSA算法的签名值,使用ANSI X9.62 格式编码。签名的原文为:
    • 一个为0x00的字节
    • 请求中的application parameter
    • 请求中的challenge parameter
    • 上面提及的key handle的值
    • 上面提及的user public key

3.3. 鉴权请求消息

  鉴权请求消息如图6所示:


图6

  消息中字段含义如下:

  • Control byte (P1):取值可为3个值:0x07 ("check-only"),0x03 ("enforce-user-presence-and-sign"),0x08 ("dont-enforce-user-presence-and-sign")
  • challenge parameter [32 bytes]:是对由挑战值组成的Client Data(后面会介绍,客户端生成的一个JSON字符串)使用SHA-256算法得到32位摘要。
  • application parameter [32 bytes]:对使用UTF-8编码的应用ID(application identity)使用使用SHA-256算法得到32位摘要。
  • key handle length byte [1 byte]:1字节表示key handle的长度。
  • key handle [length specified in previous field]:key handle的值。

3.4. 鉴权回应消息

  鉴权回应消息如图7所示:


图7

  消息中各字段含义如下:

  • user presence byte [1 byte]:0表示用户不存在,1表示用户存在。
  • counter [4 bytes]:U2F设备鉴权计数,大字节序。
  • signature:使用ECDSA算法的签名值,使用ANSI X9.62 格式编码。签名的原文为:
  • application parameter [32 bytes]:鉴权请求中的application parameter。
  • user presence byte [1 byte]:上面提到的user presence byte。
  • counter:上面提到的counter。
  • challenge parameter [32 bytes]:鉴权请求中的challenge parameter值。

3.5. clientdata

  前面的请求/回应消息中对challenge parameter的构建使用到clientdata,clientdata为一个JSON对象字符串,其对象结构ClientData定义如下:

dictionary ClientData {
    DOMString             typ;
    DOMString             challenge;
    DOMString             origin;
    (DOMString or JwkKey) cid_pubkey;
};

  ClientData结构中各属性含义如下:

  • typ:注册时使用值'navigator.id.finishEnrollment',鉴权时使用值'navigator.id.getAssertion' 。
  • challenge:使用websafe-base64编码(通常也叫urlbase64编码,见RFC4648第5章)的字符串,由在线服务网站提供。
  • origin: 网站标识。
  • cid_pubkey:可选参数。

4 参考文献

1.https://fidoalliance.org/how-fido-works/
2.https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/FIDO-U2F-COMPLETE-v1.2-ps-20170411.pdf
3.http://www.ietf.org/rfc/rfc4648.txt

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容