php使用google authenticator动态密码认证

IMG_3028未命名-2

 

1、google authenticator和我们要干嘛?
不多说,总之就是一个开放给大家使用的第三方动态密码校验软件。原来  根据二维码或者自定义输入一串密钥,authenticator就会根据当前的时间戳和这个密钥算出一个动态密码,每30秒变化一次。这个计算是本地进行的,不需要依赖网络,算法也是公开的,所以你的后端也可以算一次 做校验。

2、代码:

以下用到的Token 和 qrcode2个类,下文章底部附件可以下载到。
校验动态密码。

<?php 

include "Token.php"; 
//$key 是需要保存下来的密钥,每次需要基于这个进行认证
//$token 是需要校验的6位动态密码
//ALLOW_MFA_TIME 是允许用户手机时间和服务器时间的前后时间差,因为这个动态密码是基于时间生成的。时间差的原来其实很简单, 帮你生成前后这个时间的所有token 跟你输入的有一个是一样的 就算OK。


$tr = Token::verify_key( $key, $token, ALLOW_MFA_TIME , Token::get_timestamp() );
 
 if($tr!==true)
 {
 echo "ok";
 }
else
{
 echo "failed";
}

生成密钥和二维码

1、密钥不要自己随便去生成几个字符,不是所有字符都能用的Token中有写好的静态方法可以生成

2、二维码的生成方式很多,可以依赖第3方的或者自己生成,甚至引入一张外部图片参数中传入内容也成。   二维码的内容在以下代码注释中介绍吧:

<?php 

include "Token.php";
include "phpqrcode.php.php";

//开始生成密钥了,如果不需要二维码自己将这个密钥输入到google authenticator也是可以的(累不死你)。

$key = Token::generate_secret_key();

//二维码的内容: "otpauth://totp/小标题?secret=密钥&amp;issuer=大标题'  &amp;issuer=Funcity省略则大标题

$text = "$text = "otpauth://totp/GMTool:name"?secret=" . $key. '&amp;issuer=Funcity';

$outfile=false; $level=QR_ECLEVEL_L; $size=150; $margin=4; $saveandprint=false;

//$_SESSION['secret'] = $key; //这个我是为了先存下来,确认一次用户输入的是对的才把这个key更新入库

$enc = QRencode::factory($level, $size, $margin); 
$enc-&gt;encodePNG($text, $outfile, $saveandprint);

这样就妥了。

Token::verify_key是支持传入自定义的时间,如果你觉得你的服务器时间会有问题,就自己想办法吧,可以用curl取一下百度提供的时间戳之类的。

文件下载:点击这里下载code.zip

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>