著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:徐小花
链接:http://www.zhihu.com/question/20462696/answer/18731073
来源:知乎

开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。

实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。

目前客户端有:
android版: Google 身份验证器
iOS版:https://itunes.apple.com/cn/app/google-authenticator/id388497605

实现原理:

一、用户需要开启Google Authenticator服务时,
1.服务器随机生成一个类似于『DPI45HKISEXU6HG7』的密钥,并且把这个密钥保存在数据库中。
2.在页面上显示一个二维码,内容是一个URI地址(otpauth://totp/账号?secret=密钥),如『otpauth://totp/kisexu@gmail.com?secret=DPI45HCEBCJK6HG7』,下图:
<img src="https://pic1.zhimg.com/d37d311d9464d4c24a37e70d541364bc_b.jpg" data-rawwidth="200" data-rawheight="200" class="content_image" width="200">
3.客户端扫描二维码,把密钥『DPI45HKISEXU6HG7』保存在客户端。

二、用户需要登陆时
1.客户端每30秒使用密钥『DPI45HKISEXU6HG7』和时间戳通过一种『算法』生成一个6位数字的一次性密码,如『684060』。如下图android版界面:
<img src="https://pic1.zhimg.com/c2056261a0b106af19517697887c0b38_b.jpg" data-rawwidth="281" data-rawheight="398" class="content_image" width="281">
2.用户登陆时输入一次性密码『684060』。
3.服务器端使用保存在数据库中的密钥『DPI45HKISEXU6HG7』和时间戳通过同一种『算法』生成一个6位数字的一次性密码。大家都懂控制变量法,如果算法相同、密钥相同,又是同一个时间(时间戳相同),那么客户端和服务器计算出的一次性密码是一样的。服务器验证时如果一样,就登录成功了。

Tips:
1.这种『算法』是公开的,所以服务器端也有很多开源的实现,比如php版的:https://github.com/PHPGangsta/GoogleAuthenticator 。上github搜索『Google Authenticator』可以找到更多语言版的Google Authenticator。
2.所以,你在自己的项目可以轻松加入对Google Authenticator的支持,在一个客户端上显示多个账户的效果可以看上面android版界面的截图。目前dropbox、lastpass、wordpress,甚至vps等第三方应用都支持Google Authenticator登陆,请自行搜索。
3.现实生活中,网银、网络游戏的实体动态口令牌其实原理也差不多,大家可以自行脑补下,谢谢。
<img src="https://pic2.zhimg.com/fc0617ba6b2062bec68c87eb481d25c1_b.jpg" data-rawwidth="302" data-rawheight="144" class="content_image" width="302">

谷歌验证 (Google Authenticator) 的实现原理是什么?相关推荐

  1. 谷歌验证 (Google Authenticator) PHP版

    开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码. 实现Google Authenticator功能需要服务器端和客 ...

  2. 谷歌二次验证 Google Authenticator

    后台登录要搞令牌,类似于steam令牌.企鹅令牌等等 开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码. 实现Goo ...

  3. 【Django】使用谷歌身份验证Google authenticator

    1.说明 为了安全,可以使用Google authenticator作为二次验证的条件,使用起来很简单,只需要使用Google authenticator APP扫描一下二维码即可得到六位数验证码,验 ...

  4. google authenticator python_谷歌验证器 Google Authenticator工作原理

    很多人都听过谷歌验证 (Google Authenticator) 或用过谷歌验证 (Google Authenticator) .尤其是随着比特币等虚拟货币的兴起,各大交易所都要求绑定谷歌验证 (G ...

  5. google authenticator python_谷歌验证器(Google Authenticator)

    双因素身份认证就是经过你所知道再加上你所能拥有的这二个要素组合到一块儿才能发挥做用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一次性密码来代替传统的 ...

  6. PHP设置谷歌验证器(Google Authenticator)实现操作二步验证

    使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码.实现Google Authenticator功能需要服务 ...

  7. 使用C++实现谷歌身份验证器(Google Authenticator)

    使用C++实现谷歌身份验证器(Google Authenticator) 本机环境: windows10 x64位运行环境 1.进入网站:http://slproweb.com/products/Wi ...

  8. 【SpringBoot】61、SpringBoot中使用谷歌身份验证器(Google Authenticator)实现二步身份验证

    Google 身份验证器 Google Authenticator 是谷歌推出的基于时间的一次性密码 (Time-based One-time Password,简称 TOTP),只需要在手机上安装该 ...

  9. Google authenticator 谷歌身份验证,实现动态口令

    Google authenticator 谷歌身份验证,实现动态口令 google authenticator php 服务端 使用PHP类 require_once '../PHPGangsta/G ...

最新文章

  1. 漫画:5分钟弄懂分治算法!它和递归算法的关系!
  2. mysql的dockerfile_Dockerfile构建MySQL
  3. C#面向对象名词解释(四)
  4. 用神经网络模拟分子:钠的卤化物
  5. Android开发 asmack断线收不到通知的BUG解决
  6. Django入门:(admin.E108
  7. Boost:BOOST_VERIFY_MSG扩展的用法测试程序
  8. android 仿网易标题栏,仿网易新闻可滑动标题栏TabLayout(文字或图标)
  9. sqlserver 遇到以零作除数错误的处理 不报错的解决方法
  10. 用virt-manager管理远程KVM虚拟机
  11. hackintool怎么重建缓存_mysql表数据装满了怎么办?自增id引发的bug。
  12. 局域网ftp工具,ftp上传下载工具使用指南,5款好用的局域网ftp工具推荐
  13. C#使用Aforge对uvc协议摄像头亮度属性的更改
  14. ViewPager Kotlin 教程入门
  15. 华为PUSH 日常问题解决方案
  16. 爆火GitHub 的十大最火 Python 项目,三天收藏突破10w+
  17. 看着2022年世界杯,我无比怀念98世界杯
  18. PNG格式的证件照怎么转成JPG格式?教你一招轻松转换
  19. POJ1250解题报告
  20. java父类的称谓_《商周金文中的血缘关系称谓》

热门文章

  1. 高中经历——高考专业被调剂毁了童年梦想
  2. Jekyll 使用入门
  3. GLUEscript(wxJavascript)
  4. Linux的追逐,Windows的穷途恼指日可待
  5. VC程序调试技术,一些工具上和具体的问题,包括内存检测
  6. C++类与对象概念详解
  7. android悬浮窗代码布局,三行代码实现Android应用内悬浮窗,无需一切权限,适配所有ROM和厂商...
  8. rabbitmq怎么停止_rabbitmq 启动与停止
  9. 深度学习(Deep Learning):循环神经网络一(RNN)
  10. python local_Python3中 对local和nonlocal 关键字的改善认识(新手向)