标签归档:hardware token

聊聊双因素认证(two factors authentication)

Google为了增强账户的安全性,防止账号被盗用,引入了双因素认证。

话说这双因素认证,居然还是密码学的一个概念,其实在密码学理论中是三因素认证:

第一个要素(所知道的内容):需要使用者记忆的身份认证内容,例如密码和身份证号码等。

第二个要素(所拥有的物品):使用者拥有的特殊认证加强机制,例如动态密码卡,IC卡,磁卡等。

第三个要素(所具备的特征):使用者本身拥有的惟一特征,例如指纹、瞳孔、声音等。
通常来说,第三个要素的认证是最为强大的,但是需要比较昂贵的设备,例如指纹识别机、虹膜扫描机等等。曾经去银行办业务就有看到过柜员在不停的摸一个和USB Token差不多大小的指纹识别机,没记错的话应该是招行,需要主管授权时候,主管过来看了看,摸了一下就走了。

但是,这个第三个因素有个最大的危险就是拥有者本身容易被攻击,例如。。手指被砍下来。。在各种美片中经常看到用砍下来的手指应付各种指纹门,也有直接用枪顶着人头过去识别虹膜的。。因此,应用这个因素还是有风险的。

在顶级安全的应用中,通常会采用前两个因素共同验证,就被称为双因素认证。

最典型的双因素认证系统就是ATM机。使用ATM机时,需要银行卡和PIN,银行卡就是你拥有的东西,而PIN就是你知道的东西。

google账户的双因素认证中,引入了一个大家都有硬件设备:手机,作为要素二。

在启用双因素认证后,需要输入手机上的动态口令才可以通过验证。手机上的验证码是一个6位数字,按照google的文档,这个数字是和时间关联的,同时需要一个与服务器共享的key作为种子。

google的authenticator在第一次使用时,会要求扫描一个服务器提供的二维码,其中包含了一个用base32方式编码的key。如果硬件设备不支持扫描,也可以手动输入这个key,长度是16bits。然后就可以按照服务器设置的时间间隔生成动态口令了。生成的动态口令也是有生命周期的,常见的是30秒。

利用时间作为生成要素的一个缺点就在于必须保持服务器和令牌的时间一致,因此软件令牌都有时间校准功能。如果是硬件令牌,通常一颗纽扣电池够用几年,所以绝大部分情况下不需要考虑时间校准,确实要校准,估计是要返厂了。。

由于维持时间绝对一致是需要成本的,所以通常情况下,双因素验证中会允许时间稍有误差,google的设置不知道是多少,腾讯的手机令牌是允许两分钟。如果这个时间是两分钟,实际上就有4个动态口令可以通过验证(2*60/30)。

为了避免时间不准确,google的authenticator也支持基于计数器的动态口令,在客户端点击按钮后生成一个口令,同时计数器+1。

这个方案的好处就是不需要考虑时间,缺点也显而易见:如果客户端误按按钮,必然会引起客户端计数器和服务器端不一致,要恢复使用状态,要么调整计数器,要么换一个口令的key。前一种方式很显然会丧失一部分安全性,可能引起重放攻击,而后一种方案代价会比较高,必须要IT管理人员参与。所以google账户的登陆不支持这种方式。

为了防止手机遗失、故障等情况,google也提供了alternative的验证方式。

第一种是用一个电话号码接受短信或者语音呼叫

第二种是利用一组共10个的一次性口令,google推荐打印下来

对于那些不支持双因素认证的程序,google允许生成16位的Application-specific password,用在邮件客户端等非web方式登陆的地方。

说完应用,最后总结思路:

双因素认其实就是给现有的密码认证体系加上一层额外的保护,通过与登陆窗口物理隔离(非常非常重要)的硬件(跑在手机里的软件就当硬件了,如果你非要跑电脑里,还是废了双因素验证吧。。)生成的6位动态口令进行认证。这个口令可以是基于时间的,也可以是基于计数器的。动态口令必须有生存周期,也必须是一次性的。为了防止动态口令生成设备故障,需要提供其他的可选项例如手机短信和电话。如果没有那么高的可用性要求,IT人员作为其他的可选项也是可以的。

这方面有一些规范和指导意见,如下:

Initiative for Open Authentication (OATH)

HMAC-Based One-time Password (HOTP) algorithm specified in RFC 4226

Time-based One-time Password (TOTP) algorithm currently in RFC draft.

下一步目标是开发出给wp用的双因素认证插件,估计要花点时间了。