MFA 验证是怎么保证安全的?有点像以前网银支付时那串数字,生成的时候也不需要联网,没查到详细原理。。。
quora 上面有个回答:How does the Google Authenticator app for Android work offline?,解释了 GA(google authenticator) 是怎么工作的:
一次性密码是通过 TOTP 算法生成的(Time based OTP)
基于时间的一次性密码算法(TOTP)是一种根据预共享的密钥与当前时间计算一次性密码的算法。它已被互联网工程任务组接纳为RFC 6238标准[1],成为主动开放认证(OATH)的基石,并被用于众多多重要素验证系统当中。
TOTP是散列消息认证码(HMAC)当中的一个例子。它结合一个私钥与当前时间戳,使用一个密码散列函数来生成一次性密码。由于网络延迟与时钟不同步可能导致密码接收者不得不尝试多次遇到正确的时间来进行身份验证,时间戳通常以30秒为间隔,从而避免反复尝试。
在特定的多重因素验证应用中,用户验证步骤如下:一位用户在网站或其他服务器上输入用户名和密码,使用运行在本地的智能手机或其他设备中的TOTP生成一个一次性密码提交给服务器,并同时向服务器输入该一次性密码。服务器随即运行TOTP并验证输入的一次性密码。为此,用户设备与服务器中的时钟必须大致同步(服务器一般会接受客户端时间-1区间(也就是延迟了30秒)的时间戳生成的一次性密码)。在此之前,服务器与用户的设备必须通过一个安全的信道共享一个密钥,用于此后所有的身份验证会话。如需要执行更多步骤,用户也可以用TOTP验证服务器。
摘自维基百科:基于时间的一次性密码算法
开始的时候客户端和服务端需要协商一个密钥(服务端和客户端都有保存),之后通过密钥生成随机 6 位数字或者二维码,用来做验证,由于客户端和服务端密钥相同,且加密算法相同,生成的数字应该是一样的。
保存密钥的时候需要联网,之后就不需要了,网银的密码器也是一样的道理,里面保存一个与账号关联的密钥,登录、支付的时候用来确认是否本人,这种动态密码比静态密码更加安全,避免密码被爆破照成损失。