怎么在Java中利用OTP动态口令实现登录认证-成都快上网建站

怎么在Java中利用OTP动态口令实现登录认证

这篇文章将为大家详细讲解有关怎么在Java中利用OTP动态口令实现登录认证,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

成都创新互联网站建设提供从项目策划、软件开发,软件安全维护、网站优化(SEO)、网站分析、效果评估等整套的建站服务,主营业务为成都网站设计、网站建设、外贸网站建设app软件开发公司以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。成都创新互联深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

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

(1)时间同步

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

(2)事件同步

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

(3)挑战/应答

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

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

怎么在Java中利用OTP动态口令实现登录认证

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

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

怎么在Java中利用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+"
"      +"系统使用密码 + 动态口令双因素认证的方式登录。
请按以下方式激活手机动态口令:
安卓用户请点击下载,"      +"
苹果手机在AppStore中搜索【身份宝】(Alibaba)。下载安装后,通过扫描以下二维码激活动态口令。
"      +"";    EmailBaseLogic emailBaseLogic = new EmailBaseLogic(); //   String to, String title, String content, String imagePath    emailBaseLogic.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位校验码(每分钟变化)。

怎么在Java中利用OTP动态口令实现登录认证

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("生成动态口令出错");
  }

关于怎么在Java中利用OTP动态口令实现登录认证就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


本文题目:怎么在Java中利用OTP动态口令实现登录认证
标题路径:http://kswjz.com/article/gdggch.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流