我们往往会在不同的网站上使用相同的密码,这样一旦一个网站账户的密码泄露,就会危及到其他使用相同密码的账户的安全,这也是最近的密码泄露事件造成如此大影响的原因。为了解决这个问题,一些网站在登录时要求除了输入账户密码之外,还需要输入另一个一次性密码。银行常用的动态口令卡就是这种一次性密码的例子,在线支付网站的一次性短信密码则是另一种实现。

Google现在也推荐用户启用两步验证(Two-step verification)功能,并且除了以短信或者电话的方式发送一次性密码之外,还提供了另一种基于时间的一次性密码(Time-based One-time Password,简称TOTP),只需要在手机上安装密码生成应用程序,就可以生成一个随着时间变化的一次性密码,用于帐户验证,而且这个应用程序不需要连接网络即可工作。仔细看了看这个方案的实现原理,发现挺有意思的。下面简单介绍一下:

Google的两步验证算法源自另一种名为HMAC-Based One-Time Password的算法,简称HOTP。HOTP的工作原理如下:

客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程,此密钥不被任何第三方所知道。此外,客户端和服务器各有一个计数器C,并且事先将计数值同步。

进行验证时,客户端对密钥和计数器的组合(K,C)使用HMAC(Hash-based Message Authentication Code)算法计算一次性密码,公式如下:

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

上面采用了HMAC-SHA-1,当然也可以使用HMAC-MD5等。HMAC算法得出的值位数比较多,不方便用户输入,因此需要截断(Truncate)成为一组不太长十进制数(例如6位)。计算完成之后客户端计数器C计数值加1。用户将这一组十进制数输入并且提交之后,服务器端同样的计算,并且与用户提交的数值比较,如果相同,则验证通过,服务器端将计数值C增加1。如果不相同,则验证失败。

这里的一个比较有趣的问题是,如果验证失败或者客户端不小心多进行了一次生成密码操作,那么服务器和客户端之间的计数器C将不再同步,因此需要有一个重新同步(Resynchronization)的机制。

介绍完了HOTP,Time-based One-time Password(TOTP)也就容易理解了。TOTP将HOTP中的计数器C用当前时间T来替代,于是就得到了随着时间变化的一次性密码。非常有趣吧!

虽然原理很简单,但是用时间来替代计数器会有一些特殊的问题,这些问题也很有意思,我们选取几个进行一下探讨。

首先,时间T的值怎么选取?因为时间每时每刻都在变化,如果选择一个变化太快的T(例如从某一时间点开始的秒数),那么用户来不及输入密码。如果选择一个变化太慢的T(例如从某一时间点开始的小时数),那么第三方攻击者就有充足的时间去尝试所有可能的一次性密码(试想6位数字的一次性密码仅仅有10^6种组合),降低了密码的安全性。除此之外,变化太慢的T还会导致另一个问题。如果用户需要在短时间内两次登录账户,由于密码是一次性的不可重用,用户必须等到下一个一次性密码被生成时才能登录,这意味着最多需要等待59分59秒!这显然不可接受。综合以上考虑,Google选择了30秒作为时间片,T的数值为从Unix epoch(1970年1月1日 00:00:00)来经历的30秒的个数。

第二个问题是,由于网络延时,用户输入延迟等因素,可能当服务器端接收到一次性密码时,T的数值已经改变,这样就会导致服务器计算的一次性密码值与用户输入的不同,验证失败。解决这个问题个一个方法是,服务器计算当前时间片以及前面的n个时间片内的一次性密码值,只要其中有一个与用户输入的密码相同,则验证通过。当然,n不能太大,否则会降低安全性。

事实上,这个方法还有一个另外的功能。我们知道如果客户端和服务器的时钟有偏差,会造成与上面类似的问题,也就是客户端生成的密码和服务端生成的密码不一致。但是,如果服务器通过计算前n个时间片的密码并且成功验证之后,服务器就知道了客户端的时钟偏差。因此,下一次验证时,服务器就可以直接将偏差考虑在内进行计算,而不需要进行n次计算。

以上就是Google两步验证的工作原理,推荐大家使用,这确实是保护帐户安全的利器。

原文参考:https://blog.seetee.me/post/2011/google-two-step-verification/

转载于:https://www.cnblogs.com/gaoqiao/p/10969136.html

Google两步验证的工作原理相关推荐

  1. Google账户两步验证的工作原理【转】

    最近在考虑一些用户登录验证的问题,现阶段在涉及到一些交易时,基本上都使用的是短信验证码验证,但有朋友说,有些时候短信验证码会出现延时,不及时.于是就看了一下Google Authenticator(c ...

  2. Google两步验证安装使用方法

    http://www.williamlong.info/archives/2754.html 转载于:https://www.cnblogs.com/svennee/p/4099364.html

  3. 两步验证Authy时间同步问题

    Authy是我常用的软件之一,通常用于Google的两步验证,或者是其他基于Google两步验证的原理的衍生程序.比如Namesilo.印象笔记等均有使用. 先说说什么是两步验证. 两步验证 两步验证 ...

  4. 两步验证杀手锏:Java 接入 Google 身份验证器实战

    转载自   两步验证杀手锏:Java 接入 Google 身份验证器实战 什么是两步验证? 大家应该对两步验证都熟悉吧?如苹果有自带的两步验证策略,防止用户账号密码被盗而锁定手机进行敲诈,这种例子屡见 ...

  5. SSH 登录添加 Google Authenticator 两步验证 双因子认证

    SSH 登录添加 Google Authenticator 两步验证 双因子认证 安装 Google Authenticator # 时间与客户端进行校验,确保服务器时间与手机时间一致,避免时差导致严 ...

  6. 观察验证交换机工作原理

    ** 观察验证交换机工作原理 ** 实验原理: 研究数据链路层 交换机的工作原理 交换机收到数据包,解封装到数据链路层 学习源MAC地址,让它自己的接口一一对应起来 查看目的MAC地址,查看CAM表, ...

  7. 三型两步验证登不上_苹果手机开启了双重认证,未信任的设备之前登入了,开启了双重认证未...

    展开全部 首先需要明确的一个概念:「62616964757a686964616fe58685e5aeb931333365643661双重认证」不是「两步验证」. 「双重认证」与「两步验证」的区别 尽管 ...

  8. 浅谈Google蜘蛛抓取的工作原理(待更新)

    浅谈Google蜘蛛抓取的工作原理 什么是爬行器? 爬行器如何工作? 爬行器如何查看页面? 移动和桌面渲染 HTML 和 JavaScript 渲染 什么影响爬行者的行为? 内部链接和反向链接 单击深 ...

  9. 数字营销分析工具Google Analytics(分析)工作原理

    数字营销需要数据分析工具来调整.考核KOL,我在上篇文章"新一代智能Google Analytics助力营销分析"中对Google Analytics新版工具做了使用说明.今天来聊 ...

  10. Gmail设置两步验证密码后,foxmail收不到gmail邮件

    最近直接访问gmail.com可以登录gmail邮箱,但是用outlook或者foxmail登录不上,一直提示密码错误.原因很简单,就是你设置了google的两步验证密码.从这上面着手. 你需要使用应 ...

最新文章

  1. SAP财务管控(财务总监背后的管理大师)
  2. 【IDEA工具】java通过IDEA打包项目
  3. document.referer的使用
  4. Sonarqube plugin插件 在使用Sonar-scanner时不能 扫描 file index 动态新生成的文件 解决方案
  5. linux 占用缓存前10_Ogre的不足与改进(Ogre2.0设计方案)-1.缓存优化
  6. R与Python手牵手:多格式文件导入与爬虫
  7. Linux安全加固的常用方法
  8. 人生的两大奇迹思维:杠杆效应+飞轮效应《方法论》
  9. 如何扩大计算机的硬盘空间,c盘分区小了怎么扩大_电脑c盘分区空间太小如何扩大...
  10. 个人计算机硬件配置清单,个人台式电脑配置清单
  11. motd 自定义欢迎界面
  12. java常量final是什么_java:变量,常量和final关键字--基础篇
  13. shell读取键盘输入
  14. 打印机无法获取IP地址备忘录
  15. 1 python数据分析概述
  16. Flutter,SharedPreferences的同步处理,如Android原生般的
  17. 使用Python下载抖音无水印视频
  18. Python的自学之路:Python基础(一)
  19. telerik grid ajax,Telerik.Web.Mvc网格。在.DetailView中没有调用Ajax方法
  20. java记事本源代码

热门文章

  1. Java8新特性:接口
  2. 阿里百川SDK初始化失败 错误码是203
  3. cookie和session的区别及其原理
  4. apache 软件历史版本查询
  5. MAVEN项目标准目录结构(转)
  6. mongoDB在centos7上的安装
  7. 【Java】 大话数据结构(6) 栈的顺序与链式存储
  8. python模块之subprocess
  9. unity3d协同不同设备的代码
  10. 中软高科WEB前端面试题