一、先来了解双因素认证
双因子(2FA two-factor authentication)认证,是指结合密码以及实物(信用卡、SMS手机、令牌或指纹等生物标志)两种条件对用户进行认证的方法。其实银行网银密码+U盾、密码+手机验证码、密码+动态口令牌均属于双因素认证。以及苹果设备的登陆——登陆一台新的设备,需要在旧的设备点击同意,并生成6位数字码。

二、 谷歌密码器(Google Authenticator)的基本原理
每一种双重验证的原理是有区别的:
- 硬件令牌:企业可以以密钥卡的形式向员工提供硬件令牌,该密钥卡每隔几秒到一分钟时间生成一次代码。例如网银口令牌、U盾等。
- 推送通知:推送双因素身份验证方法不需要密码。这种类型的 2FA 向你的手机发送信号,以批准/拒绝、验证身份的请求。例如上文提到的苹果的新设备登陆认证。
- SMS 验证:SMS(也称为短信)可用作一种双因素身份验证形式,具体方式是将短信发送到受信任的电话号码。国内很普遍的认证方式。
- 人脸识别:企业级应用一般需要录入人像照片;国家级应用,例如防疫码、银行APP的人脸识别,都是基于公安部二代身份证照片库。
再来回到本文的主角,Google Authenticator是谷歌推出的一款动态口令工具,不仅可以用于谷歌账号,还可以用于广泛应用于各类网站、应用、企业设备的登陆,可以像银行宝令一样的动态密码工具,每30秒将自动更新一次动态密码,防止用户的账号信息遭到暴利破解或泄露。
1.用户需要开启Google Authenticator服务时,服务器随机生成一个类似于『DPI45HKISEXU6HG7』的密钥(16位),并且把这个密钥保存在数据库中。同时通过二维码或文本传递给用户,内容是一个字符串(otpauth://totp/账号?secret=密钥),如『otpauth://totp/[email protected]?secret=DPI45HCEBCJK6HG7』。客户端扫描二维码或手动输入,把密钥『DPI45HKISEXU6HG7』保存在客户端。
2.用户需要登陆时
客户端每30秒使用密钥『DPI45HKISEXU6HG7』和时间戳通过一种『算法』生成一个6位数字的一次性密码,如『684060』。如下图手机端界面:

服务器端使用保存在数据库中的密钥『DPI45HKISEXU6HG7』和时间戳通过同一种『算法』生成一个6位数字的一次性密码。如果算法相同、密钥相同,又是同一个时间(时间戳相同),那么客户端和服务器计算出的一次性密码是一样的。服务器验证时如果一样,就登录成功了。
Google Authenticator采用的算法是TOTP(Time-Based One-Time Password基于时间的一次性密码),其核心内容包括以下三点:
- 一个共享密钥(一个比特序列);密钥序列
- 当前时间输入;
- 一个签署函数。
综上,谷歌密码器无需联网,类似于银行口令牌的虚拟化,核心算法是“密钥+以时间为参数的加密函数”。所以谷歌密码器本质上验证的还是16的密钥。如果将16位密钥(或二维码)泄露,双重认证就失效了。同时,我们在个人使用过程中,为了避免手机遗失,可以将密钥保存到安全的地方,例如打印在纸上(物理隔断互联网,但要小心身边人),或者放在安全的云端。
三、 使用双重验证保护你的账号
绝大部分重要账号,例如手机银行、支付宝等,均自动启动了双因素验证,甚至是多因素验证。除此之外,你可以选择开通:
- 苹果双因素认证,配合Find My iPhone保护你的设备,防止遗失和钓鱼,强烈建议开启:Apple ID 的双重认证
- 如果是个人站长,若使用宝塔PHP面板,为避免爆破攻击,可以在宝塔面板设置-安全设置选项卡中,开启谷歌密码器动态口令验证。
- 评论中可以补充
[…] Google Authenticator谷歌密码器基本原理 […]