谷歌身份验证器的介绍和使用,可以参考这篇文章 谷歌身份验证器使用教程。这里,我介绍的是怎么在自己的 php 的项目中应用谷歌验证器。
- 本篇文章的介绍均为个人理解,如果有不对的地方,希望可以及时告知。谢谢!
谷歌验证器应用原理 (个人理解)
验证器是一个 app,谷歌通过一定的算法,根据一个
密匙
,会生成一个验证码。本质上就是一个密匙匹配了一个动态验证码。
所以在程序中,只要知道了谷歌的这套算法,也可以得到一个动态验证码,这个验证码会和谷歌验证器app 的验证码一致。
类似场景
我感觉这个场景有点像
qq安全中心
的动态验证码。我不知道qq是请求了安全中心的接口得到动态码,与用户输入的动态码匹配,还是也是像谷歌那样通过相同的算法得到的一个动态码。但我想,他应该是和谷歌一样通过算法得到的。只是他的算法中会匹配用户账号。
程序实现
在 github 中有现成的代码可以用 GoogleAuthenticator,我在使用 composer 加载的时候,发现有问题,但不是特别清楚这个问题所在。但是这个不重要。因为这个代码是算法已经匹配了谷歌的算法,我们不需要像 composer 更新其他组件一样更新这套代码。另外,如果你觉得 github 上的也有点繁琐的话,我看他代码实际上只用到了一个文件 GoogleAuthenticator.php,你也可以直接使用这个文件。
使用
<?php
require_once 'google/PHPGangsta/GoogleAuthenticator.php';
$ga = new PHPGangsta_GoogleAuthenticator();
// 1.创建秘钥
$secret = $ga->createSecret();
//echo "Secret is: ".$secret."\n\n";
echo "密匙" . $secret . "<br>";
// 2. 生成秘钥对应的二维码
$qrCodeUrl = $ga->getQRCodeGoogleUrl('Blog', $secret);
//echo "Google Charts URL for the QR-Code: ".$qrCodeUrl."<br>";
echo "二维码 url " . $qrCodeUrl . "<br>";
// 3.生成秘钥对应的动态码
$oneCode = $ga->getCode($secret);
//echo "Checking Code '$oneCode' and Secret '$secret'<br>";
echo "被检查的动态码: '$oneCode' and 密码是 '$secret'<br>";
// 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 中,并给一个过期时间。如果你传递到前端,则用户可以更改刚才前端的秘钥,你在处理中只是看秘钥是否与验证码匹配,这样用户用自己的秘钥,就可以跨越你的检测。
网友评论