使用Google Authenticator对用户登录进行双因素认证

多因素认证(MFA),是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。MFA的目的是建立一个多层次的防御,使未经授权的人访问计算机系统或网络更加困难,从而提高安全性。

查看演示 下载源码

最常见的应用场景是网上银行汇款,身份验证后还需要额外的短信验证码或者类似UKEY口令码才能最终完成汇款操作。多因素验证目前市面上有基于硬件和基于软件的产品,硬件产品类似于U盘,不过现在很多企业用户都使用基于软件APP形式的产品。今天我给大家介绍一款开源的二次认证系统Google Authenticator,结合我们的常见的用户登录模块,完成一个简单的二次双因素认证。Google Authenticato可以利用智能手机生产30秒动态口令,该验证器提供了一个六位数的一次性密码。目前ios 和Android 都有客户端供于下载。大家可以到Apple Store和安卓应用平台搜Eagle 2FA进行安装。

Google Authenticator双因素验证相比于传统的短信验证,具有以下优点:

  • 开源免费;
  • 避免无法接收验证短信的痛苦;
  • 无网络环境下也可用,手机欠费停机不受影响。

我们使用基于PHP的Google Authenticator组件,提供了生成密钥、生成口令码、验证口令码以及生成用于快速扫描的二维码等功能。

安装

我们使用composer安装:

composer require "phpgangsta/googleauthenticator:dev-master"
知识兔

使用

生成密钥:

$ga = new PHPGangsta_GoogleAuthenticator();
$secret = $ga->createSecret();
echo $secret;
知识兔

运行后会生成一个随机密钥:OQB6ZZGYHCPSX4AK,这个密钥应该保存在数据库里和用户信息对应,即每个用户对应一个密钥。

验证口令码:

当用户提交口令码后,需要验证口令码是否正确,可以使用以下代码:

$oneCode = $_POST['code'];
$checkResult = $ga->verifyCode($secret, $oneCode, 2); // 2 = 2 * 30秒时钟容差
if ($checkResult) {
    echo '匹配! OK';
} else {
    echo '不匹配! FAILED';
}
知识兔

实际应用

典型的用户登录双因素认证流程:

  • 1.用户输入用户名密码提交。
  • 2.后台验证用户是否合法,如果用户名密码都正确,则进入下一步二次认证。
  • 3.打开手机端APP, 找到对应生成的一次性口令码,按要求输入口令码。
  • 4.提交口令码,后台验证,如果正确则完成验证。

具体代码请参照demo演示和下载源码。

手机端APP截图:

202203131823254721840000202203131823267616960001

我们还可以做的更安全,限制验证次数,抵御暴力攻击。比如我们可以限制5分钟内最多5次口令码验证尝试,以提高系统安全性。

Google Authenticator项目在github上的地址是:https://github.com/PHPGangsta/GoogleAuthenticator

计算机