Google Authenticator,谷歌身份认证器,Google公司推出的一款动态口令工具,旨在解
决大家Google账户遭到恶意攻击的问题。该工具主要基于TOTP(Time-Based One-Time Password
,基于时间的一次性密码)算法。

需求:攻击者在通过某种方式持有了用户的用户名和密码组合,就可以登录用户账户并进行
操作。为了增强用户账户安全性,保护用户数据不被获取和利用,产生了该身份认证机制。

 
使用场景描述:用户持有一部安装有客户端的移动设备,服务器端验证用户账户信息,确认
用户身份后允许用户登录。客户端输入了用户的账户名、密码后,还需要客户端生成一个随
时间变化的一次性动态口令并要求用户输入,发送给服务器。服务器接收到用户输入的信息
后,在验证用户名、密码的基础上,再计算自己的动态口令值并和用户数据对比,匹配成功
后允许用户登录成功,否则失败。

以下为该机制的原理分析:
(1)HOTP算法分析。Google Authenticator机制主要基于TOTP算法来实现的,而TOTP算法
本身是基于HOTP(HMAC-based One-Time Password,一种基于HMAC的一次性口令算法)算法
改进的。算法核心内容包括三个参数:一个双方共享的密钥(一个比特序列)K,用于一次
性密码的生成;双方各持有一个计数器C,并且实现将计数值同步;一个签署函数即如下公
式:HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)),上面使用了HMAC-SHA-1,也可以使用HMAC-MD5
等。简单步骤如下:
1、客户端利用持有的密钥K和计数器数值C,通过上述算法公式生成HOTP值,同时计数器值
加1,然后要求用户输入该HOTP值,然后客户端将用户名、密码,连同生成的HOTP值发送给
服务器;
2、服务器获取到客户端发送的信息,解析并验证用户名、密码,然后服务器利用持有的密
钥及自身的计数器数值C,通过相同的算法生成HOTP值,再与客户端的HOTP值对比,如果成
功,则计数器值加1,并允许该客户端登录用户账户,否则拒绝登录。

算法存在的问题:客户端每次请求生成一次性密码操作都会使得计数器值加1,而同时如果
验证失败或者客户端不小心多进行了一次生成密码操作,那么服务器和客户端之间的计数器
C将不再同步,因此需要有一个重新同步(Resynchronization)的机制。由于该重同步机制
对于TOTP算法分析没有太多帮助,因此在此不再赘述,需要了解重同步机制详细的,请参看
RFC4226。

(2)TOTP算法分析。利用HOTP算法,将其中的计数器C用当前时间T来替代,同样可以得到
随着时间变化的一次性密码,并且减小计数器的代价,毕竟更多的使用场景中获取系统时间
是方便的。TOTP算法的三个核心内容也容易理解了:共享密钥K;客户端与服务器的时间同
步;签署函数TOTP = Truncate(HMAC-SHA-1(K, (T - T0) / X)),其中T0是Unix epoch(1970
年1月1日 00:00:00),X为时间分片长度。算法执行流程大致如HOTP算法,不再赘述,不同
的是,本算法中用系统时间T代替了计数器数值C作为HMAC算法的输入。

 需要注意的有几点:1、HMAC算法得出的值位数比较多,不方便用户输入,因此需要截断
 (Truncate)成一组不太长的是进制数(至少6位)2、由于时间是一直动态变化的,这就导
致服务器接收到客户端的消息,再进行TOTP值的计算时,时间上会有延时。因此,需要将时
间划片,当然,时间划片要合理,过短导致用户来不及输入并传输给服务器验证,过长导致
攻击者有足够的时间对用户账户进行攻击。Google默认的采用30秒时间分片,即每过三十秒,
系统时间T的值就会发生变化,得到的动态口令也不相同。3、同样利用系统时间的TOTP算法
也是需要重同步机制。由于网络延时、用户输入延迟等因素,可能服务器端接收到一次性密
码时,T数值已经发生了变化,这样就会导致验证失败。解决方法是,服务器计算当前时间
片以及前面的n个时间片内的TOTP值,只要其中有一个与用户输入的TOTP值相同,则验证通
过。同时也容易理解,n不能设置过大,否则将会降低安全性。该方法还有另外的功能,有
时候客户端与服务器的时钟会有偏差,这样也会造成上面类似的问题。但是如果服务器通过
计算前n个时间片的密码并且成功验证之后,服务器就知道了客户端的时钟偏差。因此,下
一次验证时,服务器就可以直接将偏差考虑在内进行计算,而不需要进行n次计算。

关于文中HOTP算法公式和TOTP算法公式的详细实现,也可以参看RFC4226,其中对于算法通
用性的考虑而做的改进值得学习。

 
值得一提的是,由于利用了系统时间,在一般情况下,生成该动态口令内嵌与程序中,本身
是无需联网的,并且系统时间普遍存在于各个设备中,算法通用性良好。

 一些总结:
1、无论是HOTP还是TOTP算法,都存在重同步问题。参考RFC4226可知,在前者的计数器C
重同步问题中,客户端计数器的值可以预料到必然大于服务器计数器的值,在验证过程中,
服务器向后计算N个HOTP值用来匹配一个客户端HOTP值,验证并通过。至于后者,TOTP
算法要求客户端与服务器时间同步,并且服务器计算TOTP值时会向前计算N个TOTP值用来
匹配一个客户端的TOTP值,从而保证了重同步。这是二者重同步问题中的区别。

2、由于上述的重同步方式,相对也会造成一定的系统安全性问题。同样参考RFC4226,
两种方式的系统服务器端,都会给服务器检测HOTP/TOTP值设置一个阀值S,用来保证服务
器不会不停的检测数值,从而限制了试图制造HOTP/TOTP值的攻击者的可能空间。

Google Authentication 机制原理的更多相关文章

  1. OAuth的机制原理讲解及开发流程

    本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...

  2. 【Xamarin 跨平台机制原理剖析】

    原文:[Xamarin 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原 ...

  3. 【Xamain 跨平台机制原理剖析】

    原文:[Xamain 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原生 ...

  4. OAuth的机制原理讲解及开发流程(转)

    1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...

  5. 【转载】OAuth的机制原理讲解及开发流程

    1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...

  6. 深入理解Spring Security授权机制原理

    原创/朱季谦 在Spring Security权限框架里,若要对后端http接口实现权限授权控制,有两种实现方式. 一.一种是基于注解方法级的鉴权,其中,注解方式又有@Secured和@PreAuth ...

  7. Google Authentication的实现 - Odoo 安全登录

    在前边的一篇文章中,我们提到了利用二次验证增强Odoo登录的可靠性:http://www.cnblogs.com/kfx2007/p/6023991.html 今天我们来具体实现这一步: 后端的实现 ...

  8. Atitit事件代理机制原理 基于css class的事件代理

    Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...

  9. ldap + kerberos + google authentication 实现两步验证

    第一步:ldap + kerberos 整合  ,参考之前的文章 第二步:google authentication 安装配置,参考之前的文章 第三步:整合 ldap + kerberos + goo ...

随机推荐

  1. 【转载】js 各种复制到剪贴板

    一.实现点击按钮,复制文本框中的的内容                         <script type="text/javascript"> function ...

  2. Table样式

    .tb_org th { background-color: #; color: #ffffff; } .tb_org { border-right: 1px solid silver; border ...

  3. 解决Maven的Could not update project XXX configuration NullPointerException 错误

    1. 从eclipse删除这个项目,但不要从磁盘删除: 2. 关闭eclipse: 3. 删除项目目录下的:.settings目录: 4. 删除项目目录下的:.projects目录: 5. 删除项目目 ...

  4. 理解tcp协议的3次握手和面向连接

    1.tcp是有连接的, 这个不是说他有个实际的连接,这个是个虚拟的连接,连接的保持信息不是由连接的路线来保存的,他是由连接的两方来保存其状态信息,这就是面向连接的, 2.tcp要3次握手: 客户端发给 ...

  5. XUtils3 的 环境搭建

    XUtils3 的 环境搭建 环境搭建三部曲 ----------------------- 说明 : author  修雨轩陈 使用andorid Studio 已经创建了一个项目 并且自己需要使用 ...

  6. 判断iframe是否加载完成的完美方法

    var iframe = document.createElement("iframe"); iframe.src = "http://www.jb51.net" ...

  7. ajax基础1

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况 ...

  8. Discuz! X3搬家后UCenter出现UCenter info: MySQL Query Error解决方案

    Discuz! X3 X2.5论坛搬家后 登录UCenter出现报错:UCenter info: MySQL Query ErrorSQL:SELECT value FROM [Table]vars ...

  9. gulp教程之gulp-concat

    简介: 使用gulp-concat合并javascript文件,减少网络请求. 1.安装nodejs/全局安装gulp/本地安装gulp/创建package.json和gulpfile.js文件 1. ...

  10. 几种jQuery 实现无限滚动的插件

    1.EndLess Scroll 2.infinite-scroll插件的使用