美文网首页
谷歌身份验证器在php中的应用

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

作者: 云龙789 | 来源:发表于2019-10-02 16:45 被阅读0次

    谷歌身份验证器的介绍和使用,可以参考这篇文章 谷歌身份验证器使用教程。这里,我介绍的是怎么在自己的 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 中,并给一个过期时间。如果你传递到前端,则用户可以更改刚才前端的秘钥,你在处理中只是看秘钥是否与验证码匹配,这样用户用自己的秘钥,就可以跨越你的检测。

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

    相关文章

      网友评论

          本文标题:谷歌身份验证器在php中的应用

          本文链接:https://www.haomeiwen.com/subject/xedmyctx.html