目录

  • 一、概念理解
  • 二、所需资料
  • 三、实验过程
  • 四、深入理解
    • 1. 安全性原因
    • 2. 不联网原因
    • 3. 优势
  • 五、总结

本文介绍了动态令牌的概念、来源、国内外现状,用实验模拟“基于时间的动态令牌”应用表层背后的实现逻辑,探索了动态令牌的安全性体现。亮点是我探索问题的思路过程。

一、概念理解

依照百度百科的定义,“动态令牌是一种是根据专门的算法生成一个不可预测的随机数字组合,一个密码使用一次有效,被广泛运用在网银、网游、电信运营商、电子政务、企业等应用领域。 动态口令是一种安全便捷的帐号防盗技术,可以有效保护交易和登录的认证安全,采用动态口令就无需定期修改密码,安全省心,从而在最基本的密码认证这一环节保证了系统的安全性”。从技术来说分有三种形式:时间同步、事件同步、挑战/应答。三种形式的具体区别有兴趣的可以看一下:动态令牌_百度百科

看完这段定义,对于从未接触动态令牌的我来说心里毫无波澜,只记得几个关键字:应用广泛、安全。应用广泛的原因可能是因为安全,外加可能的操作简单等,但它的安全性体现在哪里呢?或者说国内已经有很多防盗的技术,那它的优势到底在哪里呢?只有弄清楚这个问题,我才能知道这项技术的价值和出现的意义,我们才有研究的必要。

带着这个问题,我开启了探索之路。首先查看CSDN的C1实训里面的介绍,它运用了OTP(One-Time Password,一次性密码)技术,是一种二次验证码的校验通过
        二次验证码见名知意就是需要用户在两个地方操作,验证两次。那它较一次验证码肯定有优势。能想到的一次验证码是网站上注册时的字符验证码,它的目的是验证你是人还是机器,防止不法分子疯狂创建账号,并发量太大,使网站服务器崩塌,可一次验证码不能验证登陆人是否就是该账号的主人,并且很多都可以使用人工智能中的OCR(字符识别)技术破解。而二次验证码多一层验证,是多层保障,这层保障体现在你账号与其他信息的关联,比如你的手机号(短信收取验证码)、身份证号、邮箱、帅气/漂亮的脸蛋……只要能验证你是“你”的任何东西。(PS:此处的二次验证码是我相较一次验证的区别做的定义,我把它理解为广义的二次验证码。而谷歌中的二次验证码是指动态令牌类似的技术,我理解为狭义的二次验证码)。迄今为止,短信验证码应用最广泛,身份证号和人脸识别涉及到重要信息,网站不是随随便便就能获取到,并且成本太大。

​​​

另外在我在看百度百科定义时,发现短信密码(短信验证码)和动态令牌(二次验证)不是一回事,所以又回归了那个问题:为什么短信验证码已经如此普遍,还要再次发明动态令牌的技术?当时在百度上搜到一篇博客感觉介绍的非常不错。附上链接:两步验证和短信验证码安全对比
       大概意思就是短信验证码权限极大,被广泛应用在各大平台上,并且很多不输密码,验证码登录就可以,一旦被不法分子利用后果不堪设想。更可怕的是SIM卡劫持可以通过多种方式实现,是一种可以完全控制一个手机号的技能。并且这种技能的学习门槛和实现难度都不高,比较低级的SIM卡劫持方法甚至可以在网上随便搜到教程。

       更安全的方式就是基于APP的二步验证,也就是动态令牌的一种体现。这种令牌类似于银行业的动态口令卡(比如网银U盾)——一种类似于U盘的专门显示动态验证码的设备。但想使用动态口令卡必须将其随谁携带,便利性不佳。所以现在不少平台都启用了依赖于手机APP的两步验证,相当于把动态口令卡集成在了手机中。使用手机两步验证APP时,用户需要首先安装并设置好APP,包括对需要验证的账户的绑定。绑定完成后再登陆这些账号时,两步验证APP就会推送动态验证码。用户必须在登陆界面输入该验证码才能完成登陆。当然,两步验证APP不仅可以用来登陆,也可用来验证其它敏感操作。大部分两步验证APP基于TOTP(Time-based One-Time Password)机制,不需要任何网络连接(包括Wi-Fi),也不需要短信和SIM卡,验证码完全在手机本地生成。所以APP两步验证几乎免疫了SIM卡劫持。

读到这里,我还是不太懂,为什么它不用网络连接呢?不是任何的验证过程都需要服务器吗?不需要短信和SIM卡,验证码如何产生和验证?这些问题直到我进行实验,才慢慢理解了。如果你也有这种疑问,请往下看。

二、所需资料

  1. CSDN实训教官湘王老师写的动态令牌实现源码。

    链接:https://pan.baidu.com/s/1XGGB8krQI8djIeBw9lxQEA
    提取码:yn6x

  2. 需要引入的jar包:
    2.1 Apache Commons Codec.jar
           链接:https://pan.baidu.com/share/init?surl=b6U0djUhuljxHZVJjwfV7Q
           提取码:illr
    2.2 qr.jar (朋友写的用于创建二维码的工具包)
           链接:https://pan.baidu.com/s/1uX9IEA9zMnWaPjDLkMiPxQ
           提取码:841s

  3. 实训学习线索:

三、实验过程

  1. 将源码解压后,用IDE编辑器(此处使用IDEA)打开工程文件,如下图所示:

  2. 打开工程后发现有地方报错。原因是未引入 Apache Commons Codec 库,需要引入jar包。

    此处通过查阅外网,找到了解决方法:

    a. 手动引入。单击链接【我是下载地址,请点击我】,点击jar按钮进行下载。


       下载完之后需要让将jar包配置到工程中,告诉Java它的地理位置。此处有很多引入方法,我就介绍一种最不用动脑子的——使用IDEA工具。File -> Project Structure -> Modules -> 选中要添加build path的项目 -> Dependencies -> 点击右边的小加号 -> 选择JARs or directories ->选择要添加的外部jar包。如图所示:



       b. 使用Maven/Gradle自动下载依赖。【链接在此,请点击我】打开链接,选择Maven /Gradle配置处理器自动进行配置。(此步骤需要前期配置Maven环境,本文不做过多阐述)


jar包引入之后就不报错啦。

  1. 根据实训提示,打开OTPAuthUtilTester.java文件,先使用OTPAuthUtil类下的generateSecret()方法生成一个用户密钥。

  1. 在程序中将密钥与账号绑定在一起,并作为参数生成链接并赋值给protocaluri。

  1. 将protocaluri作为参数创建一个二维码,使用上面资料里附的生成二维码的jar包:qr.jar,并用刚讲的方式再次导入到工程中。

之后在测试文件(OTPAuthUtilTester.java)中加入导包语句和生成二维码语句。

  1. 将二维码保存到手机中,并用手机打开微信/支付宝打开二次验证码小程序,用二维码创建账户。(PS:也可直接将密钥发给用户,用户手输用户名和密钥。用二维码只是因为密钥太长,用户不好记)。

扫描二维码的结果如下:

点击添加之后就会出现账户每分钟产生出的code值。

  1. 这一步就到系统验证是否成功了,需要把原先随机产生secret换成自己账号的secret值。


随后在测试文件中将手机app上显示的验证码输入,就能测出是否相同。(验证码30秒换一次,必须在时间码显示的30秒内测试通过)。


运行结果如下,验证成功:

四、深入理解

验证虽然成功,但还没有想通为什么老师发的源码和支付宝/微信上计算的code值就相同,难道老师写的计算code的算法和小程序上的是一样的?还有为什么这样就安全了,这个问题还没解决。

要想深入理解,必须深挖方法的源码。

  1. 生成密钥generateSecret():


可以看出使用一种强随机的方式生成密钥,并且使用一种解密方式解码,这个密钥直接作为参数传给测试文件的验证方法和小程序,猜测验证码(code)的生成过程与密钥有关。
后来我查资料才知道在实际项目中,此处生成的Secret是需要在该用户的账号下才能解码,其他人访问时看到的都是加密后的结果)。

  1. 生成二维码链接generateTotpURI():
    前面分析的是为了方便传递密钥,并不会在生成code中起作用。
  2. 验证口令是否正确OTPAuthUtil.verify(secret, code):

    里面用到genrateCode(secret)方法,继续深挖。
  3. 系统生成code方法genrateCode(secret):



上述说明code值计算与当前时间戳有关,所以每30秒都不一样,最终的返回值中generateTOTP方法的参数有用户密钥,因此每个用户算出来的code值都不相同。只要generateTOTP()后面的参数和小程序中的一样,就可以在同一时间段内,对于同一账户(密钥)算出一样的code值。在此又产生出一个问题:我猜想湘王的源码是为了测试这个过程,所以和小程序的算法一致。但是真正的大型项目如果知道内部的加密算法再加上如果知道用户密钥,不就可以像测试文件一样,把用户的code值算出来并通过验证吗?

在我查资料时,看到这样的描述【来源:两步验证和短信验证码安全对比】:

1. 安全性原因

国内的一般都是独占类型,这就保证每个系统的算法可以不同,独立出来。“但国外的可能已经很成熟了,可以自动检验是哪个算法”(我的猜想)。但是还是觉得不太对劲,不能保证安全性。后来与朋友进行交流,说起密钥在数据库中储存时是经过加密的(具体有偏移量,很复杂),并且每个用户的加密方式都不一样,只有当该用户登录时才能解密,因此保证了密钥只有该用户知道,而别人无法破解,并且验证码30秒钟时间很短,黑客很难在这么短时间内破解。所以只要当时生成的密钥/二维码不给别人看(就像手机验证码不给别人一样),就可以保证安全性

2. 不联网原因

并且计算code值得方法只和手机本地存储的secret和时间戳有关,因此在不联网的情况下,也能计算。

3. 优势

  1. 密钥会经过十层加密,外带偏移量等,证实黑客很难攻击。

  2. 服务器每时间步长自动计算code值,不需要人为参与。

  3. 用户打开手机app就可看到,不用一直接收短信,用户不会觉得厌烦。

  4. 不需联网和SIM手机卡,黑客很难攻击,安全性高。

五、总结

二次验证码是一种非常安全的验证身份方式,但国内由于大多都是独占性的,普遍性不高。希望国内会有信誉可靠的大公司推出开放类的两步验证APP,允许用户绑定各种第三方账户,抛弃短信验证码。这样才能把SIM卡劫持的危害降到最低。

C1实训-动态令牌(二次验证码)原理及实现相关推荐

  1. CSDN实训 - Java模拟二次验证码(动态令牌)

    文章目录 前言 一.什么是动态令牌? 二.使用的Jar包 1. 生成二维码Jar包 2. Apache Commons Codec 3. 项目工具类 4. 下载链接 三.IDEA导入外部Jar包 四. ...

  2. 实训课教案二:计算机软件安装初步

    实训课教案二:计算机软件安装初步 实训内容:计算机操作系统安装之前的 CMOS设置和磁盘分区格式化 实训课时:2课时 实训地点:计算机组装与维护实验室 实训目的: 1.掌握CMOS的基本设置. 2.能 ...

  3. 图像识别_2010暑期实训有感【二】

    还是好好谈谈项目方面的吧.我们一个小组12人,算是人数比较多的了.这个项目还是比较大的,而且时间比较紧,总共20天,中间每周日休息,所以剩下的也就不足20天时间了.况且前期还有培训,会耽误一些时间.所 ...

  4. 实训记录(二)——分镜的制作!

    一回生二回熟,有了第一次,就会有第二次! 今天写的内容主要是有了剧本之后的下一步操作呢,那!当!然!就!是!出!分!镜!啦! 其实我们专业在大二的时候(忘了说啦,我们小组成员在大三之前至少都是数字媒体 ...

  5. 实训日记(二)——分镜

    分镜 碎碎念:上次是第一次编写,用的那个编辑器在首行缩进这一点上纠结好久..怎么都缩不上,导致最后那篇剧本看起来有点乱糟糟的.然后这次随意点到了富文本编辑器,感觉确实好用多了(小声)!!我爱了!!! ...

  6. C1实训-Java薪资转换(适合初学者)

    目录 一.实验任务 二.实验思路 三.涉及知识点 1. Java基本结构 2. Java控制台输入 3. Java控制台输出 4. 基本数据类型 5. 变量 6. while循环 7. 异常捕捉 8. ...

  7. 软件测试性能测试实训报告,实验二:带传动性能测试实验报告

    以下为<实验二:带传动性能测试实验报告>的无排版文字预览,完整格式请下载 下载前请仔细阅读文字预览以及下方图片预览.图片预览是什么样的,下载的文档就是什么样的. 实验二: 带传动性能测试实 ...

  8. 项目实训(十二)FPS游戏之角色移动的脚步声

    文章目录 前言 一.存放脚步声音 二.设置脚步声 1.角色发出声音的必备条件 2.如何检测角色是否有移动 3.如何实现角色踩踏位置的对应材质的声音 三.修复下蹲移动时没有脚步声音 前言 FPS游戏之角 ...

  9. JAVA实训-连连看(二)

    前言 emmm 没想到这篇文章居然这么多人在看 代码是本科第一个JAVA练手的项目,后面不在更新的啦,使用的时候慎用欧 github 自取 https://github.com/leandon/JAV ...

最新文章

  1. linux cp sync,通过SSH使用Rsync传输文件,复制和同步文件及目录
  2. 本科生新算法打败NeRF,不用神经网络照片也能动起来,提速100倍
  3. java数据模型公共类_UML数据建模工具之Enterprise Architect(EA)实例
  4. SharePoint中的列表(List) 与Content Type 之五
  5. linux基础2-cd、mkdir、touch、umask、chattr、lsattr、SUID/SGID/Sticky Bit
  6. JAVA----------------------华为机试--------------------------删除字符串中出现次数最少的字符...
  7. 让图片算好高宽再显示
  8. [WorldWind学习]12.WavingFlags和WavingFlagLayer
  9. 【C语言简单说】十五:while循环
  10. 仪器和软件通讯测试软件,软件定义的仪器-测试测量-与非网
  11. Echarts数据可视化event图表事件的相关操作,开发全解+完美注释
  12. KMP算法 学习笔记
  13. SmartUpload应用
  14. PyTorch安装及试用 基于Anaconda3
  15. 新员工月度计划制定心得
  16. Java集合优雅的判空/非空
  17. 网络安全有哪些岗位,如何成为一位优秀的网络安全工程师?
  18. 思维题:12个硬币中有1个假币,假币的重量与真币不同,如何用天平最多称量3次找出假币?
  19. Redis学习(1)——下载与配置[转]
  20. LQ0213 兰顿蚂蚁【模拟】

热门文章

  1. 教师查询系统C语言,C语言教师管理系统代码
  2. matlab simulink 实现简单的脉宽调制PWM仿真
  3. 深度学习的开胃菜——常用的机器学习知识梳理
  4. 3.OpenCV可视化(Viz)——单目相机标定模拟
  5. 一个屌丝程序猿的人生(五十八)
  6. 【历史杂谈】之《古代最美的谎言》
  7. 25套五彩缤纷的矢量网页背景图片素材【免费下载】
  8. Linux运维工程师主要做什么工作?
  9. 利用ArcGIS创建要素与表之间的关系类并发布带有关系数据表的要素服务
  10. php通用查询系统excel,Laravel+Excel通用查询填报系统