摘要:随着互联网密码泄露事件频发,越来越多的产品开始支持多因子认证(MFA),TOTP则是MFA领域里最普遍的一种实现方式,本文介绍TOTP的原理和华为云的实践经验。

原理

TOTP(Time-Based One-Time Password)算法是基于时间的一次性密码算法,根据预共享的密钥与当前时间计算一次性密码。它已被互联网工程任务组接纳为RFC 6238标准,成为主动开放认证的基石,并被用于众多多因子认证系统当中。

TOTP其实并不是一种全新的算法,可以看成是HOTP(HMAC-Based One-Tme Password)算法的一个具体化的场景。HOTP的算法可以在RFC 4226看到详细描述,所以相比HOTP算法,TOTP的RFC文档看起来非常简洁。

上面是HOTP算法的公式,参数K表示共享密钥,参数C表示计数器counter。

TOTP算法实际上是以时间变量作为参数C的HOTP算法,所以TOTP算法的公式应该是

参数K仍然表示共享密钥,而参数T表示时间变量。

时间变量T

TOTP的核心和实践方案也是围绕时间变量T,但T不是简单的时间戳,

X表示步长,默认是30秒,T0表示UTC时间的起始时间戳,即1970年一月一日,Floor函数向下取整。T必须是一个大于32bit的整型,才能支持到2038年以后。例如当X=30时,59对应的T为1,60对应的T为2。

TOTP在MFA上的应用

MFA(Multi-Factor Authentication),多因子认证,是计算机系统中一种进行身份认证的方法,用户需要通过两种或两种以上的认证手段的校验才能进入系统,访问资源。

开通MFA一般都需要先在登录认证系统中将用户的身份和用户的物理设备进行绑定关联,在登录过程中,除了输入密码(用户知道的),还需要输入用户的物理设备(用户持有的)上显示的访问码(passcode)来完成整个身份验证。说明:不是所有的MFA验证过程都需要用户主动输入访问码。

上图示意的过程即MFA的通用流程,例如我们使用网银进行转账就需要拿出在银行窗口开户时银行提供的一个U盾,按下按钮,U盾上即显示一串数字,输入这次数字到网银软件上才能完成转账。

但上图的MFA流程存在一个工程难题,即第4步中认证系统后端还需要向MFA设备(或MFA设备的后台系统)进行一次验证,这个验证过程限制了MFA的应用场景,运行在企业数据中心的认证服务器一般不被允许访问公网,即使访问公网也会因为网络时延导致登录体验变差,TOTP算法的应用很好的解决了这个难题。

使用TOTP算法,只要客户端(证明方)和服务端(校验方)保持时钟一致,且双方预先设置好一个共享密钥的前提下,在同一个时间片段内算出来的值是一样的。正是基于这样的原理,在认证系统中先将用户身份和该共享密钥绑定,再将共享密钥置入物理设备,在认证过程中,物理设备和认证系统各自通过TOTP算法根据共享密钥和时间戳计算出访问码,只要访问码对比一致就能证明用户持有该物理设备,整个认证过程中物理设备和认证系统不需要有交互,非常灵活。

基于TOTP算法的设备,可以分为虚拟(软件)MFA和硬件MFA。

虚拟MFA

虚拟MFA即通过软件来模拟硬件MFA设备,在手机上安装一个支持TOTP协议的APP,例如Google Authenticator, Microsoft Authenticator,华为云APP也同样支持标准的TOTP协议。虚拟MFA通过扫码二维码图片或者手工输入的方式置入校验方生成的共享密钥,并且可以同时关联多个校验方,非常方便实用。

硬件MFA

下图中是一种信用卡形状的硬件MFA,可以放到钱包里,在需要时按下卡片上的按钮即可显示六位数字,非常便携。

安全考虑

1.哈希算法

TOTP算法的强度取决于背后的HOTP算法,但HOTP的哈希函数是HMAC-SHA1,并不是我司推荐的安全算法。TOTP算法在具体实现中也可以使用HMAC-SHA256或HMAC-SHA512,但使用HMAC-SHA1仍然是最通用,兼容性最好的实现,Google Authenticator就是使用HMAC-SHA1。

2.密钥随机性

对TOTP算法最可能的攻击手段就是暴力破解,因此共享密钥必须是密码学安全的密钥,足够随机。密钥长度应该和哈希算法的长度尽量匹配。

另外,校验方必须将密钥存放在安全的区域,使用加密方式保存,防止泄露,只有在需要验证OTP的时候才解密。同时还需要限制最小权限,只有校验方自身才能拿到密钥。

3.通信安全

证明方和校验方应该使用安全的通道通信,例如SSL/TLS。

4.防暴力破解

一般TOTP用于MFA时,校验方只会要求输入6位数字,很容易被暴力破解,在工程实践中可以当第二因子的尝试失败达到一定次数后锁定客户端。

5.保持一次性

TOTP算法在同一个时间片段(例如,30s)内的输出都是一样的,如果同一个TOTP验证已经成功验证过一次,该验证码的第二次尝试应该被拒绝,这样才能保证OTP“一次性”的基本性质。

6.时间片段

时间片段越长,被破解的风险就越高,但考虑到证明方需要人工输入验证码,应该留下足够的操作时间。推荐使用30秒作为默认时间片段,在安全和易用性之间达到一个平衡。

可用性考虑

1.“后向兼容”

因为证明方和校验方都是基于时间来计算OTP,如果证明方在一个时间片段的最后时刻发送OTP,在请求达到校验方时,已经进入下一个时间片段,如果校验方使用当前时间来计算OTP,肯定会匹配失败,这样会导致一定的失败率,影响可用性。

校验方应该不仅仅以接收请求的时间,还应该用上一个时间片段来计算TOTP,增强容错性。不过,容错窗口越长,被攻击风险越高,“后向兼容”一般推荐不超过一个时间片段。

2.支持校准

证明方和校验方的时钟可能不完全一致,特别是很长一段时间没有进行过TOTP认证,时钟偏移导致匹配失败。校验方的认证系统可以提供一种校准(re-sync)的能力,让证明方输入TOTP验证码,校验方往前计算两个时间片段(60s),往后计算一个时间片段(29s),通过匹配结果记录证明方的时钟的偏差值,完成时钟校准。在证明方以后发起验证时,校验方直接使用偏差值计算TOTP。但如果厂商已经支持足够的“后向兼容”,校准不一定需要支持。

点击关注,第一时间了解华为云新鲜技术~

解读登录双因子认证(MFA)特性背后的TOTP原理的更多相关文章

  1. 强制禁用gitlab的双因子认证:Two-Factor Authentication

    (一)问题描述: 此博客解决如下问题:禁用gitlab的双因子认证 禁用前,如图(此时,你在gitlab中什么也干不了) (二)思路分析: 百度了很多方法,都不可靠(如不可靠的说明:https://s ...

  2. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  3. centos6.5使用Google auth进行双因子认证

    1.环境 系统:centos6.5 x86_64 [root@uu ~]# uname -a Linux uu 2.6.32-642.el6.x86_64 #1 SMP Wed Apr 13 00:5 ...

  4. 【Linux】使用Google Authenticator 实现ssh登录双因素认证

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  5. odoo12之应用:一、双因子验证(Two-factor authentication, 2FA)(HOTP,TOTP)附源码

    前言 双因子认证:双因子认证(2FA)是指结合密码以及实物(信用卡.SMS手机.令牌或指纹等生物标志)两种条件对用户进行认证的方法.--百度百科 跟我一样"老"的网瘾少年想必一定见 ...

  6. (诊断)解决GitHub使用双因子身份认证“Two-Factor Athentication”后无法git push 代码的“fatal: Authentication failed for ...”错误

    在GitHub上采取双因子身份认证后,在git push 的时候将会要求填写用户的用户名和密码,用户名就是用户在GitHub上申请的用户名,但是密码不是普通登录GitHub的密码. 一旦采取双因子身份 ...

  7. 用Abp实现双因素认证(Two-Factor Authentication, 2FA)登录(一):认证模块

    @ 目录 原理 用户验证码校验模块 双因素认证模块 改写登录 在之前的博文 用Abp实现短信验证码免密登录(一):短信校验模块 一文中,我们实现了用户验证码校验模块,今天来拓展这个模块,使Abp用户系 ...

  8. 轻松搭建CAS 5.x系列(8)-在CAS Server增加双因素认证(DUO版)

    概述说明 为了让系统更加安全,很多登录会加入双因素认证.何为双因素,如果把登陆作为开一扇门的话,那就是在原来的锁上再加一把锁,第二锁用新的钥匙,这样安全系数就更加高了. CAS是通过账号名和密码来认证 ...

  9. 业余草双因素认证(2FA)教程

    所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤.密码是最常见的认证方法,但是不安全,容易泄露和冒充.越来越多的地方,要求启用双因素认证(Two-factor au ...

  10. 双因素认证(2FA)教程

    所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤. 密码是最常见的认证方法,但是不安全,容易泄露和冒充. 越来越多的地方,要求启用 双因素认证(Two-factor ...

随机推荐

  1. vcpkg manifest 的使用

    最近项目上要使用 CMakeLists 管理,由于 Windows 版本有依赖到 vcpkg 提供的库,所以需要使用 vcpkg manifest 来统一设置库的版本,方便后续维护 推荐一个文章,介绍 ...

  2. tunm, 一种对标JSON的二进制数据协议

    Tunm simple binary proto 一种对标JSON的二进制数据协议 支持的数据类型 基本支持的类型 "u8", "i8", "u16& ...

  3. 【matplotlib 实战】--雷达图

    雷达图(Radar Chart),也被称为蛛网图或星型图,是一种用于可视化多个变量之间关系的图表形式.雷达图是一种显示多变量数据的图形方法.通常从同一中心点开始等角度间隔地射出三个以上的轴,每个轴代表 ...

  4. Mach-O Inside: BSS Section

    1 BSS 起源 BSS(Block Started by Symbol)这个词最初是 UA-SAP 汇编器(United Aircraft Symbolic Assembly Program)中的一 ...

  5. 2022.7.16 lhm_ 讲课纪要

    前言 啊好的,这节课又是对牛弹琴课...... 虽说题给的不难,以黄绿为主,,穿插了一个蓝一个紫,但是给一群不知道什么是树什么是DAG的人讲树形dp和dag上dp有点.... 顺便讲了讲拓扑排序和记忆 ...

  6. MySQL-管理员root@'locahost' 丢失,怎么处理?

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 跳过授权表 ----> 不开启验证功能(无密码登录) --skip-grant-tables 阻止所有tcp/i ...

  7. 京东广告研发近期入选国际顶会文章系列导读——CIKM 2023篇

    近年来,放眼业界广告推荐领域的算法获得了长足的发展,从几篇奠定基础的序列学习.大规模图学习.在线学习&增强学习.多模态推荐问题等起步,业内算法不断迭代发展并在学术和工业场景上取得不错的应用. ...

  8. Batrix企业能力库之物流交易域能力建设实践

    简介 Batrix企业能力库,是京东物流战略级项目-技术中台架构升级项目的基础底座.致力于建立企业级业务复用能力平台,依托能力复用业务框架Batrix,通过通用能力/扩展能力的定义及复用,灵活支持业务 ...

  9. 3C智能移动周边产品龙头企业如何集成企业内部所有异构系统数据

    全面并自动集成品胜集团全域业务系统中的各类业务数据:结构化.标准化.自动化集团全部异构系统数据,提升全公司整体项目管理水平:梳理与简化跨部门.跨系统流程,清晰定义流程节点及业务边界,打通部门间信息流通 ...

  10. 【封装】Splay

    注意确保操作合法性,否则可能陷入死循环 以点权作为排序依据 struct Splay{ #define ls p[u].son[0] #define rs p[u].son[1] #define ma ...