GIT地址:https://github.com/suyin58/otp-demo

动态码截图:

  

  在对外网开放的后台管理系统中,使用静态口令进行身份验证可能会存在如下问题:

    (1) 为了便于记忆,用户多选择有特征作为密码,所有静态口令相比动态口令而言,容易被猜测和破解;

    (2) 黑客可以从网上或电话线上截获静态密码,如果是非加密方式传输,用户认证信息可被轻易获取;

    (3) 内部工作人员可通过合法授权取得用户密码而非法使用;

  静态口令根本上不能确定用户的身份,其结果是,个人可以轻松地伪造一个假身份或者盗用一个已有使用者的身份,给企业造成巨大的经济和声誉损失。本文主要介绍并实现了一种动态口令(OTP)的实现方式。

  动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便技术手段,是一种重要的双因素认证技术,动态口令认证技术包括客户端用于生成口令产生器的,动态令牌,是一个硬件设备,和用于管理令牌及口令认证的后台动态口令认证系统组成。

otp从技术来分有三种形式, 时间同步、事件同步、挑战/应答。

(1) 时间同步

原理是基于 动态令牌和 动态口令验证服务器的时间比对,基于 时间同步的 令牌,一般每60秒产生一个新口令,要求服务器能够十分精确的保持正确的时钟,同时对其令牌的晶振频率有严格的要求,这种技术对应的终端是硬件令牌。

(2)事件同步

基于事件同步的令牌,其原理是通过某一特定的事件次序及相同的种子值作为输入,通过HASH算法中运算出一致的密码。

(3)挑战/应答

常用于的网上业务,在网站/应答上输入 服务端下发的 挑战码, 动态令牌输入该挑战码,通过内置的算法上生成一个6/8位的随机数字,口令一次有效,这种技术目前应用最为普遍,包括刮刮卡、短信密码、动态令牌也有挑战/应答形式。

使用阿里云身份宝(或者Google Authenticator)时间同步实现OTP动态口令

  如上图,是一种基于时间同步的OTP计算方式,是通过客户端和服务器持有相同的密钥并基于时间基数,服务端和客户端采用相同的Hash算法,计算出长度为六位的校验码。当客户端和服务端计算出的校验码相同是,那么验证通过。

  由于客户端需要存储密钥和计算校验码的载体,阿里云的身份宝(或者Google 的Authenticator)提供了手机端的APP进行密钥存储和校验码计算。下面我们以这两款客户端为例,实现在应用采用OTP进行权限验证,主要流程如下图:

流程关键代码如下,(更详细代码,请Git下载:https://github.com/suyin58/otp-demo)

1           用户注册:

1.1          生成OTP密钥:

String secretBase32 = TotpUtil.getRandomSecretBase32(64);oper.setOtpSk(secretBase32);

1.2          生成OTP扫描用字符串:

约定字符串格式如下:

  • otpauth://totp/[客户端显示的账户信息]?secret=[secretBase32]
String totpProtocalString = TotpUtil.generateTotpString(operCode, host, secretBase32);

1.3          将1.2中生成的字符串生成二维码,通过邮件发送给用户

              String host = "otptest@wjs.com"; // 自定义String totpProtocalString = TotpUtil.generateTotpString(operCode, host, secretBase32);String filePath = f_temp;String fileName = Long.toString(System.currentTimeMillis()) + ".png";try{QRUtil.generateMatrixPic(totpProtocalString, 150, 150, filePath, fileName);}catch (Exception e){throw new RuntimeException("生成二维码图片失败:" + e.getMessage());}String content = "用户名:"+operCode+"</br>"+"系统使用密码 + 动态口令双因素认证的方式登录。</br>请按以下方式激活手机动态口令:</br>安卓用户请点击<a href='http://otp.aliyun.com/updates/shenfenbao.apk'>下载</a>,"+"</br>苹果手机在AppStore中搜索【身份宝】(Alibaba)。下载安装后,通过扫描以下二维码激活动态口令。</br>"+"<img src=\"cid:image\">";EmailBaseLogic emailBaseLogic = new EmailBaseLogic();
//            String to, String title, String content, String imagePathemailBaseLogic.sendWithPic(email,"账户开立通知", content, filePath + "/" + fileName);

1.4          将用户注册信息与1.1的OTP密钥存储到数据库中

数据存储代码(略)

2           客户端工具使用

2.1          下载APP

安卓用户下载地址:http://otp.aliyun.com/updates/shenfenbao.apk

苹果手机在AppStore中搜索【身份宝】(Alibaba),或者Google Authenticator

2.2          扫描二维码

使用下载的APP,扫描1.3邮件中的二维码,客户端获取密钥。APP使用密钥基于时间算出6位校验码(每分钟变化)。

1           用户登录

客户端输入登录用户名、用户密码,以及2.2客户端工具中的6位校验码。

1.1          服务端根据用户名和用户密码获取用户信息和密钥

代码参考略

1.2          服务端使用密钥基于时间算出6位校验码

        String secretHex = "";try {secretHex = HexEncoding.encode(Base32String.decode(secretBase32));} catch (Base32String.DecodingException e) {LOGGER.error("解码" + secretBase32 + "出错,", e);throw new RuntimeException("解码Base32出错");}long X = 30;String steps = "0";DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");df.setTimeZone(TimeZone.getTimeZone("UTC"));long currentTime = System.currentTimeMillis() / 1000L;try {long t = currentTime / X;steps = Long.toHexString(t).toUpperCase();while (steps.length() < 16) steps = "0" + steps;return generateTOTP(secretHex, steps, "6","HmacSHA1");} catch (final Exception e) {LOGGER.error("生成动态口令出错:" + secretBase32, e);throw new RuntimeException("生成动态口令出错");}

1.3          比较客户端和客户端校验码是否一致

代码参考略

其他,Demo中的例子可以使用身份 + 密码,先进行密码验证,在通过动态口令进行二次验证,使系统登录更加安全可靠。

转载:https://www.cnblogs.com/loveyou/p/6989064.html

使用OTP动态口令(每分钟变一次)进行登录认证相关推荐

  1. 使用otp动态口令ssh登录linux

    linux上各应用的权限认证使用pam机制(http://www.linux-pam.org/ https://github.com/linux-pam/linux-pam ). 这里需要一个支持ot ...

  2. OTP动态口令之Java实现双重认证

    前言 双重认证(英语:Two-factor authentication,缩写为2FA),又译为双重验证.双因素认证.二元认证,又称两步骤验证(2-Step Verification,又译两步验证), ...

  3. OTP 动态口令验证

    OTP 动态口令验证. 简介 动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态 ...

  4. 简述OTP动态口令及其实现

    背景 最近用到了OTP, 遂mark一下 OTP 动态口令验证可以看作是服务端和客户端之间通过约定相同的算法来实现验证功能, 也即你在客户端看到的动态口令是客户端通过算法生成的无需请求服务端获取 TO ...

  5. OTP动态口令的Java实现

    最近项目需要在应用中在登录时增加otp动态口令,作为二次密码的验证,原谅本人的孤陋寡闻居然是初次听说这技术,然后各种在网上查相关资料,发现想研究透此中算法时间太紧迫.鉴于此本人就不细说这个技术原理了( ...

  6. 身份认证OTP动态口令应用案例

    着互联网技术的发展,电子商务.企业办公.电子银行等互联网应用正在日益紧密的和我们的工作.生活相关联.在我们享受互联网带来便利的同时,却一直被互联网安全问题困扰着,有了杀毒软件来帮我们查杀病毒,有了防火 ...

  7. 动态口令(OTP,One-Time Password)原理与实践(TOTP)

    TOTP:Time-Based One-Time Password Algorithm,基于时间同步的一次性口令,动态口令 技术标准:https://tools.ietf.org/html/rfc62 ...

  8. 动态口令(OTP)认证技术概览

    动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便技术手段 ...

  9. 【转】动态口令(OTP)认证技术

    动态口令(OTP,One-Time Password)又称一次性密码,是使用密码技术实现的在客户端和服务器之间通过共享秘密的一种认证技术,是一种强认证技术,是增强目前静态口令认证的一种非常方便技术手段 ...

最新文章

  1. MongoDB数据库(二:高级操作)
  2. 大促下的智能运维挑战:阿里如何抗住“双11猫晚”?
  3. linux开机自动启动数据库,mysql随linux开机自动启动
  4. Udp通讯(零基础)
  5. 线上分享|云和恩墨大讲堂201902:MySQL基础之体系结构
  6. python 精度计算 性能_Python 优化存储和精度
  7. 欧姆龙plc OMRON SYSMAX CP1H-E 使用 CXONE_V4.60 连接和编程
  8. ubuntu11.10安装sopcast
  9. 两招快速教会你们PDF怎么转图片jpg格式
  10. jquery获取地址栏参数
  11. mini2440----keil for AMR之IIC读写EEPROM(AT24C08)
  12. PDF删除水印与添加水印方法介绍
  13. 【C++/嵌入式笔试面试八股】大纲介绍
  14. 管理三规则——吉格勒定理、洛克定律、韦特莱法则
  15. 需求来源以及竞品分析
  16. 大话西游之GUI编程—(—)DOS时代
  17. python有哪几种模块_python常用模块有哪些?
  18. ES的安装使用(windows版)
  19. 日语笔记(1) 动词(一类动词、二类动词、三类动词)
  20. Python下对setup.py模块的安装方法

热门文章

  1. 今天早上被AS卡爆的结论
  2. mysql dump select_mysql5.5中mysqldump: Got error: 1142: SELECT,LOCK TABL com
  3. windows不能访问共享文件夹的终极解决办法
  4. 多媒体系统是指利用计算机技术和什么技术,四川自考07311《多媒体技术》全真模拟试题(一)...
  5. Pytorch:循环神经网络-LSTM
  6. 结束语句之 break
  7. Redis可视化工具使用办法
  8. jmeter 接口测试快速入门
  9. CBSsport的NBA直播数据整理小结一下……
  10. 多线程 CGD快速迭代