网上搜索关于FIDO(FastIDentity Online,快速在线身份认证)的中文文章一把一把,但要么是FIDO联盟的资讯,要么对官网的规范进行只言片语翻译,往往留下最深印象的几个字是“杀死密码”,身边知道FIDO的人将其等同于生物认证。直到在某个会议上听了FIDO联盟执行董事Brett McDowel讲的FIDO overview报告后,才起了好奇心,迅速翻阅了官网关于UAF/U2F的整体介绍,对FIDO技术有了进一步的了解。很想好好写篇咋呼的文章叫“FIDO:互联网口令的埋葬者”,但下笔后发现严谨的文风写不了,也就只能讲究写大白话了,才有了现在的文章题目。
说FIDO之前必须严谨的澄清一下“口令”与“密码”的区别,因为发现国内很多专家都在混淆这两个词,直接导致媒体和大众将这两个词等同起来。老外不会用错,因为对应的英文名字大不同,口令对应的是password,而密码对应的是cryptography,前者就是一串字符,知道这些字符就代表了“你就是你”,因为只有你拥有这个字符串;后者意指密码学相关技术,是整个信息安全的基石所在。
(先插入个搜索到的没出处的图片,提升下逼格,里面文字意思是输入口令!)
password.jpg
1 为啥会有FIDO?
用口令来验证身份相信老祖宗就会用到,小到两个士兵对个暗号,大到交战公文传递都需要。互联网起来后,几乎是网站/应用验证用户的唯一方式,输入框中熟悉的星号如果验证正确就代表了这个用户是合法的。但现在越来越多的人感到了它是不安全的,并开始尝试改进。比如在服务器端,做人不能像xx那样存储口令明文,至少得哈希一下再存,能加点盐最好不过了。在用户那改进的地方更多,让他增加口令的长度,不能只写sb两个字母;让他增加口令的复杂度,再说一遍不能只写sb,要有特殊字符;让他安装控件保护口令,不能连sb这样的口令都想复制粘贴;让他不同的网站用不同的口令,至少应该用sb和2两个口令来区分百度sb和百度2吧。
这些方式提升了口令的安全性,但没有解决本质的安全问题,这些问题突出体现在:
a) 口令存储面临泄露之患。代表用户身份的口令通常在服务器端进行判别验证,一些大网站、大应用被脱库的惨烈教训凸显了这种模式的弊端。存明文口令直接导致身份冒用,存哈希口令,只要攒够足量彩虹表也大部分可破解,各种加盐的哈希变形也不解决根本问题。
b) 口令传输有被截取之忧。监听口令之于嗅探,就像“hello world”之于编程。只要含有身份的信息被偷走就有身份泄露之嫌,尽管这些信息可能受到了直接加密、SSL/IPSec类安全协议等手段的保护,这种方式在密码学上仍然被认为是不安全的。
c) 用户面临口令记忆之扰。厂商、专家往往喜欢教育用户登陆网银、微信、论坛需要设置不同的口令,这对用户而言痛苦不堪。就好比上帝对用户说,要安全还是要便利,要安全就少废话,把这一页的口令都给我记住;要便利的话出了安全问题别TMD向我祷告。厂商其实也不想做上帝,让用户做二选一是转移责任的无奈之举。
既然口令认证的方式在用户端、传输端和应用服务端都有问题,那就干脆来一场变革吧,让口令都去死翘翘吧。这个时候我们切换到大神出场场景:PayPal的安全老大MichaelBarrett说问题都摆在这了,咋整?他的好基友Ramesh Kesanupalli(生物识别专家)说,用户所知道的口令不如所拥有的U盾,但你PayPal的U盾不是还是让用户随身带才行,用我搞的指纹吧。Barrett说好,但不能本地验啊,把你的指纹模板从用户手里采到我这验,我被脱库了还是不行啊。大神Taher Elgamal扶了扶眼镜,说吵吵啥呢,老子30年前的论文就把这问题解决了,SSL都是我的涂鸦之作,沿着这个思路干吧,用私钥做身份,你PayPal存公钥。Barrett觉得可行,说“事搞清楚了,但得起个响亮的名号,丫指纹不是新东西,公私钥不是新东西,不行必须得包装一下,名字叫FIDO吧,再拉几个兄弟成立个联盟。”
2 FIDO在技术上咋整?
FIDO的旗子扯起来了,开始干了,必须现有技术路线,新东西为什么能解决口令安全的问题呢?根本原因在于是联盟两伙人在干,各懂各的,但这也是它的先进性,相比于以前的认证方式变革在于它把认证方式和认证协议分开了,在原来都是一回事,协议里面把口令就验了,现在本地认证就看你指纹对不对或者虹膜对不对,如果是你张三的,我就把私钥给你解出来,认证协议采用公私钥体制去对端验证一下。协议里面用到的挑战应答方式也是老土老土的了。
这么看倒是捋顺了。客户端是浏览器后者app,FIDO在上面先提供一层javascript API,往下走就是传递消息了,先后经过message层(数据体)和驱动层(usb、蓝牙、NFC等)就到了FIDO device了,这个设备应该尽量是安全的,比如随机数用真随机噪声源产生、公私钥对在内部产生,只有对应的库能调用,外面邪恶的程序没法调用等。在服务器端就是各个应用服务了,给它配个认证服务器,维护着客户端FIDO的信息,包括公钥、id等,这些东西是公开的,被人脱库也不怕。客户端和服务器端交互的时候走个“挑战-应答”方式,给个随机数防冒用,给个KEY HANDLE区分下不同的应用。
工作模式搞定了,但还得有初始模式,在FIDO device里面得把应用的id记住,应用得把FIDO device记住啊,于是FIDO就搞了个简单的注册机制,这个过程安全性确实比较弱,不过也没办法,为了后续工作模式的安全只能忍了。要想安全估计只能线下分发初装了。
顺便说一下,FIDO统一了物理的验证方式,指纹目前是最成熟的,人脸(立马想到了在汉诺威展示的那张马云的脸,算法真伟大,连他都能识别)、虹膜、掌纹、步态等都发展很快,这些生物认证方式毫无疑问会是未来的主流,可以期待和展望的是口令以后确实不会再坑爹了。
3 FIDO在伟大国度怎么落地?
FIDO联盟在2012年夏天成立后,扯着嗓子喊了几年,不少小弟被感召进来,总数已达二百五,因为它的分层机制还不错,做传感器的进来了,做ASM库的进来了,做应用的也来了,做浏览器也进来了,就剩上升为真正的标准了,现在光specification还不够,影响力还得靠standard才行,这估计是FIDO的目标。但目前的规范也是有一些问题的,尤其是必须考虑我们伟大国家的特色,这可能也是FIDO之前设的都是子主题工作组,突然来个了FIDOChina工作的原因吧。
首先,公私钥体制不错,数字证书签名验证也用的这个,但是运维起来是不是还得靠现成的大量PKI设施,得直接支持数字证书才行。这个需要的是库的厂家来提供解决方案。得要考虑现实情况,工行有自己的一套CA,建行也有自己的一套,还互相不认,这些证书得用起来。
其次,现在厂家重点发力在移动端,得多考虑PC端啊,不能光windows还得linux啊,我伟大国度有很多特定行业的,都有自己的全国专网,机器都是特定的。厂商进度有点慢啊。
第三,互认证的问题是不是得考虑下啊,解决了用户验证的问题,用户也得相信你应用服务是合法的啊,FIDO设备信息给你小了说是信息泄露,无关痛痒,大了说还可能钓我的鱼啊。
第四,身份认证的问题解决了,是不是搞个报文认证啊。密码学教科书可是将Authentication分为两种的:ID和message。前者解决的人真实的问题,后者解决的信息真实的问题。
后两个是通用的问题也放在这一节了。
4 结束
FIDO这个东西虽然不是全新的东西,看上去创新性好像不足,但将旧技术组合起来解决大问题就已然是创新了,对于现在广泛依赖口令的互联网认证方式确实是向前迈了一大步。
网友评论