最近公司迁移机房,不知道为何用google authenticator来做验证。这下直接导致我们在这个公司有三种形式的token。。。实体token、宁盾和ga。真够麻烦。

不过迁移机房之后至少我们可以不用登陆windows server来做跳板,所有过程在终端完成。那么就可以直接用expect脚本来实现自动化了。问题就剩下怎么生成这个随时会变的token。

去github上找了找,结果发现离线生成ga的token竟然是可行的。这点和我当初想的不太一样。之前道听途说,token在服务端和客户端都用了非常牛逼的加密算法,所以才导致其破解不了。但实际上看来加密算法竟然是可以直接公开的。。对于这种算法而言,必须的条件就只有一个,就是分发给你的独一无二的key。用这个key在服务端和client端每30s进行一次计算,然后就可以得到一个六位数字,关心具体算法的可以看这里:

https://github.com/cch123/googleAuthenticator

两边进行匹配即可。而在服务端识别key和用户身份则是通过当初把这个key分发到哪一个账户下了,也就是把key发给了哪一个人。在服务端进行account和key的绑定即可。如果client端不慎泄露了key,那么只要在服务端把该账户的key换掉即可。

其实你想想的话,实体的token也是这么个原理。分发token硬件这个行为和我们这里分发key其实是一个意思,key被直接封装到了硬件里,对用户不可见。甚至说像有些银行的加密狗,其实可以key和token都对用户不可见。上文中的泄露key在这里对应啥捏,就是你的token硬件丢了呗。。不过好在实体的token就算拿到了,别人也没法猜出你的账户。

有了这些知识准备,我们就可以把生成token的流程融入到自动化登陆的expect脚本里了,只要简单的封装即可~