从应用市场下载一个做身份认证的app,比如之前阿里的身份宝(现在已经搜索不到了),还有个FreeTOTP Authenticator(红帽子的,也是搜索不到了),包括谷歌的,也没搜到,就搜索到一个微软的Authenticator
实现的效果就是,扫码,或者输入一串字母,进行绑定后,就会app里会生成一个几十秒内生效的验证码,后续登录系统,会多加一层校验信息(除了用户名和密码外)。
然后比较好奇里边的逻辑,就自己研究了一下,所以记录下了这篇文章
TOTP是Time-based One-time Password的简称,即基于时间的一次性密码,需要安装手机TOTP APP,部分TOTP APP在打开时有FACE ID、Touch ID指纹识别等生物识别认证功能,相当于2FA/MFA(双因子认证/两步认证/多因素认证),只在激活时用到初始静态密码,阅后即焚,以后使用时,不需要联网,不需要WIFI或数据流量,离线使用,只与时间有关。
TOTP动态密码认证具有以下特点:
1.30~300秒自动更新新密码,不怕泄露分享密码,不怕暴力破解,不怕抓包窃听,不怕在陌生环境、公共场所中当众使用,适用于零安全零信任的网络环境
2.用户认证数据与WEB/SQL服务器无关,不怕脱库
3.手机APP显示动态密码,不需要记忆密码,不会忘记密码;临时分享密码,过后不需要修改密码
4.指定手机安装APP,只有在有此手机的地方才能登录,而且即使拿到手机也无法克隆到其它手机中
由于这个一次性秘钥,是基于时间戳的,等于服务器端自己按照时间推移,会生成一份秘钥,移动端的app也是基于时间的推移,不断的,离线也可以生成使用期限仅为几十秒内的秘钥。所以,可以很明显的发现,但凡移动端的时间不准了,时间差了几分钟后,再生成的秘钥就没法使用了
python有一个库可以直接生成totp的码,名字就是pyotp
>>>import pyotp >>>import base64 >>>str = 'DFLHQLIUEBkcld hs fliuv' >>>secretKey = base64.b32encode(str.encode(encoding="utf-8")) >>>secretKey b'IRDEYSCRJREVKRKCNNRWYZBANBZSAZTMNF2XM===' >>>totp = pyotp.TOTP(secretKey) >>>totp>>>totp.now() '256103' >>>totp.verify(256103) True >>>totp.verify(631438) False
pyotp还提供直接生成谷歌的二维码的
>>>pyotp.totp.TOTP('dfsfdsafdsfsadfsdfsdafsa').provisioning_uri("username", issuer_name="User") 'otpauth://totp/User:username?secret=dfsfdsafdsfsadfsdfsdafsa&issuer=User'
然后把生成的这个字符串做成二维码,那客户端安装的app就可以直接扫码,和这个码绑定,然后就可以直接生成校验码了
上边这个实例是最最简单的,到时候,可以服务端前置一个检验过程,类似校验登录用户的用户名和密码,然后用base64把用户名+密码的字符串解密一下,然后用这个串作为secret,生成对应的二维码进行校验。
服务器端可以用下边这个代码,做校验:
>>>pyotp.TOTP("dfsfdsafdsfsadfsdfsdafsa").now() '778544'
把服务器端自己保存维护的这个验证码,和用户自己手机上下载的客户端app上,绑定了上边的二维码,自己生成的验证码,一坐比对,就可以实现身份校验了。
补充一点,上文中一直提到的这个客户端app,其实可以直接从应用商店下载的,谷歌有,微软有,阿里也有,随便下载一个官方的就可