摘要:随着互联网明码泄露事件频发,越来越多的产品开始反对多因子认证(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。但如果厂商曾经反对足够的“后向兼容”,校准不肯定须要反对。

点击关注,第一工夫理解华为云陈腐技术~