2FA双因素认证

想详细了解请看阮一峰

2FA双因素认证

一般来说,三种不同类型的证据可以验证一个人的身份。

秘密信息:只有用户知道的某种信息
个人物品:该用户的私人物品,比如身份证
生理特征:该用户的遗传特征

这些就是三种“因素”。
双因素认证就是指,通过验证同时需要两个因素的证据。

TOTP基于时间的一次性密码

它是公认的可靠解决方案,已经写入国际标准RFC6238。
步骤:
第一步,用户开启双因素认证后,服务器生成一个密钥;
第二步,服务器提示用户扫描二维码(或其它方式),把密钥保存到用户手机。也就是说服务器和用户手机现在都有同一把密钥(密钥必须和手机绑定);
第三步,用户登录时,手机客户端使用这个密钥和当前时间戳,生成哈希值,有效期默认为30秒。用户在有效期内把哈希值发给服务器;
第四步,服务器也用密钥和当前时间戳生成哈希值,跟用户提交的哈希值比对,只要两者不一致就拒绝登陆。

TOTP算法

保证手机客户端和服务端在有效期内得到同一哈希值的公式:

TC = floor((unixtime(now) − unixtime(T0)) / TS)
----------------------------------------------
TC表示时间计数器
unixtime(now)是当前Unix时间戳
unixtime(T0)是约定的起始时间点的时间戳,默认是0,也就是1970年1月1日。
TS 则是哈希有效期的时间长度,默认是30秒。

上面公式变成:

TC = floor(unixtime(now) / 30)

所以,只要在 30 秒以内,TC 的值都是一样的。前提是服务器和手机的时间必须同步。
接下来就可以算哈希值:

TOTP=HASH(SecretKey, TC)

总结

双因素认证的有点在于,比单纯的密码登陆安全。就算密码泄露,只要手机还在,账户就是安全的。
缺点在于登陆变麻烦了。而且它不意味着账户的绝对安全,入侵者依旧可以通过盗取cookie或token,劫持整个会话(session)。
还有一个问题,就是账户恢复。一旦忘记密码或丢失手机,想要恢复,就势必要绕过双因素认证,从而形成漏洞。除非采用两套双因素认证,一套用于登录,一个用于恢复账户。

posted @ 2019-03-17 21:27  桥前石头  阅读(320)  评论(0编辑  收藏  举报