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. PHP简单文件上传

    一个简单的PHP上传文件的例子: upload.html <html> <body> <form action="upload.php" method ...

  2. iOS开发 QQ粘性动画效果

    QQ(iOS)客户端的粘性动画效果 时间 2016-02-17 16:50:00  博客园精华区 原文  http://www.cnblogs.com/ziyi--caolu/p/5195615.ht ...

  3. ios回调函数的标准实现:protocol+delegate

    一.项目结构

  4. testlink部署与迁移

    几个特殊的文件: 1.D:\xampp\htdocs\testlink\config.inc  安装配置文件,此处需要修改安装目录(g_repositoryPath.log_path) 2.D:\xa ...

  5. java网络编程,简单的客户端和服务器端

    1.服务器端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ...

  6. Android N preview 试用

    一.下载更新包 下载地址:https://developer.android.com/intl/zh-cn/preview/download.html 注意下载适合你手机的安装包哦 二.把你手机的oe ...

  7. 20145224&20145238 《信息安全系统设计基础》 第四次实验

    20145224&20145238 <信息安全系统设计基础>第四次实验 课程:信息安全系统设计基础 班级:1452 姓名:陈颢文 荆玉茗 学号:20145224 20145238 ...

  8. csshover.htc CSS兼容

    以下为csshover.htc 内容 <attach event="ondocumentready" handler="parseStylesheets" ...

  9. .net 项目 调用webservice 出错,异常信息:对操作“xxx”的回复消息正文进行反序列化时出错。解决方案。

    项目运行好好的,增加并更新WebService后,出错,捕获异常信息为:对操作“xxx”的回复消息正文进行反序列化时出错.解决方案. 认真分析异常信息后,得到关键提醒: {"读取 XML 数 ...

  10. Python’s SQLAlchemy vs Other ORMs[转发 4]peewee

    peewee peewee is a small, expressive ORM. Compared to other ORMs, peewee focuses on the principal of ...