zoukankan      html  css  js  c++  java
  • Coding 两步认证技术介绍

    什么是两步认证

    在介绍两步认证之前,首先来看下目前主流的几种认证方式。

    图片

    上图中的认证方式大体上可以分为三大类

    1.You know : 比如密码,这种只有我们知道的

    2.You are : 比如指纹,这种只有我们拥有的

    3.You have : 比如信用卡,这种只属于你的

    了解上面所说的三大类之后,我们就很容易的理解下面几点。

    什么是两步认证?

    两步验证,对应的英文是 Two-factor Authentication(2FA),从名字可以看出,「两步」是 2FA 的重点,而两步就是我们上面所提到的 You know + You Have ,也就是 密码 + 一次性密码(One Time Password,OTP)

    为什么我们需要两步验证?

    传统的密码认证方式,如果在用户名密码在其他网站上泄露,任何用户都可以使用你的账号密码进行登陆做任何操作。但有了两步认证就能在一定程度上有效的避免这种情况的发生。因为在每次登录时,不仅需要输入您的帐户密码,还需输入移动设备为您生成的一次性动态验证码

    OTP

    前面说过,2FA 中使用的是一次性密码(One Time Password,OTP),也被称作动态密码。一般 OTP 有两种策略:HOTP ( HMAC-based One Time Password) 和TOTP ( Time-based One-time Password) 。目前被广泛使用的正是后者这种基于时间的动态密码生成策略。

    算法大体是这样:

    1. 客户端和服务器事先协商好一个SECRET,用于一次性密码的生成过程,此密钥不被任何第三方所知道。此外,客户端和服务器都采用时间做计数器。
    2. 客户端对密钥和计数器的组合(SECRET,time/30)使用HMAC(Hash-based Message Authentication Code)算法计算一次性密码,公式如下:HMAC-SHA-1(SECRET, time/30)
    3. 各种算法加特效后成6位数字

    在这里就只简要介绍该算法,如想深入了解
    ==> https://tools.ietf.org/html/rfc6238

    基于TOTP的密码有如下特点

    1. 无需记忆,不会产生password这样的泄漏问题
    2. 动态生成,每30s生成一个,安全性大大提高
    3. 对网络无要求,离线下仍可正常使用
    4. 成本低,无需购买硬件和软件

    两步认证流程

    1. 服务器随机生成一个类似于『DPI45HKISEXU6HG7』的密钥,并且把这个密钥保存在数据库中。
    2. 在页面上显示一个二维码,内容是一个URI地址(otpauth://totp/账号?secret=密钥?issuer=厂商)
    3. 客户端扫描二维码,把密钥『DPI45HKISEXU6HG7』保存在客户端。
    4. 客户端每30秒使用密钥『DPI45HKISEXU6HG7』和时间戳通过TOTP『算法』生成一个6位数字的一次性密码

    两步认证的其他情况

    然后仅仅只是做好上面这种正常的验证流程是不够的,Coding 的两步认证在一些异常情况下做了很多处理。

    1. 生成的 OPT 应该是不能复用的,也就是用户在登陆或者危险操作时输入完一次 OPT 后,手机端 OPT 仍然未刷新时,在进行登陆或者危险操作时输入刚才的OPT是无效的,必须等待手机上OPT的刷新。
    2. 既然可以离线使用,那么怎么保证时间的差异性,我们服务端会兼容服务器时间的前后30s。从而有效的避免细微时间上差异而导致的验证失败,同时也避免了用户刚输入完 OPT 后还未做提交操作时 OPT 刷新而引起验证失败。
    3. 在遇到使用遍历所有6位数数字进行暴力破解 OPT 时,我们会对错误次数进行限制,90s 限制其错误次数能有效避免暴力破解的出现。
    4. 在开启两部认证后,其他所有登陆的客户端都会因为开启两部认证而过期,必须重新登陆。

    两部认证的实现

    目前 Coding 采用的 https://github.com/wstrange/GoogleAuth 实现的TOTP 算法,在提供 TOTP 算法之外,该库提供了可以存储用户 secret 的接口,采用的 ServiceLoader 方式,ServiceLoader 方式可以通过链接了解更多==>http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html

    参考阅读

      1. http://jacob.jkrall.net/totp
      2. http://www.insaneprogramming.be/blog/2014/05/14/two-factor-otp-security
      3. https://github.com/google/google-authenticator-android
      4. https://github.com/google/google-authenticator/tree/master/mobile/ios
  • 相关阅读:
    SAX解析xml,小实例
    Pull解析xml,小实例
    TCP通信小实例
    android 获取手机信息
    mysql创建用户与授权
    java执行SQL脚本文件
    IOUtils.readFully()的使用
    下载工具类
    vue element ui 父组件控制子组件dialog的显隐
    springboot-mybatis配置多数据源
  • 原文地址:https://www.cnblogs.com/Coding-net/p/4755031.html
Copyright © 2011-2022 走看看