两步验证的工作原理

为了安全性,我们常常使用二次验证,一般是6位的数字,常见的应用场景是银行的口令卡,游戏账户,公司的vpn登录等

使用流程

  • 用户在一个“相对安全”的环境里登录到服务器后,开启激活二次验证
  • 服务器根据用户名生成一个密钥,返回一个包含该信息的二维码或者直接返回字符串
  • 用户使用任一款身份验证器,比如Google Authenticator,扫描该二维码绑定(该二维码一般具有时效性,一天后失效)
  • 绑定之后,该验证器每30s更新生成一个6位数字,用户在登陆时不仅需要输入原有的登陆密码还需要输入该6位数字

优势

  • 身份验证器绑定时是单次通信且一般身份验证是私有的手机或者电脑,再者生成的二维码具有时效性,而单次密码多次通信且易被相关浏览器记住密码,这样的话二次验证要比单次密码安全得多

原理

主要是基于Time-based One-time Password

  • 客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程,此密钥不被任何第三方所知道。上文的提到的二维码信息就是和用户名绑定的密钥
  • 客户端和服务器同步时间戳
  • 客户端和服务器端每隔一定时间如30s,利用密钥和当前时间戳生成6位数字

问题:

  • 由于网络延时,用户输入延迟等因素,可能当服务器端接收到一次性密码时,T的数值已经改变,这样就会导致服务器计算的一次性密码值与用户输入的不同,验证失败。解决这个问题个一个方法是,服务器计算当前时间片以及前面的n个时间片内的一次性密码值,只要其中有一个与用户输入的密码相同,则验证通过。当然,n不能太大,否则会降低安全性。
  • 我们知道如果客户端和服务器的时钟有偏差,会造成与上面类似的问题,也就是客户端生成的密码和服务端生成的密码不一致。但是,如果服务器通过计算前n个时间片的密码并且成功验证之后,服务器就知道了客户端的时钟偏差。因此,下一次验证时,服务器就可以直接将偏差考虑在内进行计算,而不需要进行n次计算。

软件


©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页