谷歌身份验证器在php中的应用

谷歌身份验证器的介绍和使用,可以参考这篇文章 谷歌身份验证器使用教程。这里,我介绍的是怎么在自己的 php 的项目中应用谷歌验证器。

  • 本篇文章的介绍均为个人理解,如果有不对的地方,希望可以及时告知。谢谢!

谷歌验证器应用原理 (个人理解)

验证器是一个 app,谷歌通过一定的算法,根据一个密匙,会生成一个验证码。本质上就是一个密匙匹配了一个动态验证码。
所以在程序中,只要知道了谷歌的这套算法,也可以得到一个动态验证码,这个验证码会和谷歌验证器app 的验证码一致。

类似场景

我感觉这个场景有点像 qq安全中心 的动态验证码。我不知道qq是请求了安全中心的接口得到动态码,与用户输入的动态码匹配,还是也是像谷歌那样通过相同的算法得到的一个动态码。但我想,他应该是和谷歌一样通过算法得到的。只是他的算法中会匹配用户账号。

程序实现

在 github 中有现成的代码可以用 GoogleAuthenticator,我在使用 composer 加载的时候,发现有问题,但不是特别清楚这个问题所在。但是这个不重要。因为这个代码是算法已经匹配了谷歌的算法,我们不需要像 composer 更新其他组件一样更新这套代码。另外,如果你觉得 github 上的也有点繁琐的话,我看他代码实际上只用到了一个文件 GoogleAuthenticator.php,你也可以直接使用这个文件。

使用

createSecret();
//echo "Secret is: ".$secret."\n\n";
echo "密匙" . $secret . "
"; // 2. 生成秘钥对应的二维码 $qrCodeUrl = $ga->getQRCodeGoogleUrl('Blog', $secret); //echo "Google Charts URL for the QR-Code: ".$qrCodeUrl."
"; echo "二维码 url " . $qrCodeUrl . "
"; // 3.生成秘钥对应的动态码 $oneCode = $ga->getCode($secret); //echo "Checking Code '$oneCode' and Secret '$secret'
"; echo "被检查的动态码: '$oneCode' and 密码是 '$secret'
"; // 4.检查传递的秘钥与动态码是否匹配。最后一个参数应该是时间。值是30秒的倍数。 // 但是谷歌验证器 app 的动态码好像是30s 变化一次,这个我没注意 $checkResult = $ga->verifyCode($secret, $oneCode, 2); // 2 = 2*30sec clock tolerance if ($checkResult) { echo 'OK'; } else { echo 'FAILED'; }

使用方案

注意:在使用中,并不是在代码里向我上面那样1234段代码都要写的。

  • 1.固定秘钥方案

这种方案,每个登录者,都会使用同一个秘钥,获取到的动态验证码也是一致的

class GoogleAuthenticator extends BaseModel
{
    // 添加秘钥常量
    const SECRET = '76HF7QX56CQ3LU5V';
....
}

$goole = new GoogleAuthenticator();
 $checkGoogle = $goole ->verifyCode(GoogleAuthenticator::SECRET, $_POST['google'], 1);
        if (!$checkGoogle) {
//code 谷歌验证码不对
        }
图片.png
  • 2.每一个用户使用自己的固定验证码

在用户注册后,告知用户的谷歌验证器秘钥,并存入数据库相关的字段。匹配的时候,将上面的秘钥常量改成使用数据库中的用户秘钥即可

  • 3.每次登陆都会产生一个新的秘钥

这种场景,建议使用扫码的形式,因为这样比较快捷。秘钥有20多位的长度,用户输入会很费时间。这种方案,秘钥要在展示前端页面前的控制器里面生成。你可以将刚才生成的秘钥保存在 session 中,并给一个过期时间。如果你传递到前端,则用户可以更改刚才前端的秘钥,你在处理中只是看秘钥是否与验证码匹配,这样用户用自己的秘钥,就可以跨越你的检测。

个人推荐还是第一种方案和第二种方案比较好,因为这样能保证秘钥是自己程序生成的,并没有用户伪造。当然,第三种方案自己程序严禁的话,也是没问题的

你可能感兴趣的:(谷歌身份验证器在php中的应用)