当前位置:首页 > PHP教程 > php高级应用 > 列表

php实现动态口令认证的示例代码

发布:smiling 来源: PHP粉丝网  添加日期:2024-03-25 21:05:17 浏览: 评论:0 

谷歌身份验证器Google Authenticator是谷歌推出的一款动态口令工具,解决大家各平台账户遭到恶意攻击的问题,一般在相关的服务平台登陆中除了用正常用户名和密码外,需要再输入一次谷歌认证器生成的动态口令才能验证成功,相当于输入二次密码,以达到账户的高安全性。

例如交易所、金融平台、以及一些钱包等项目等等,都会使用谷歌身份验证器Google Authenticator来做二次认证,开启谷歌身份验证之后,登录账户,除了输入用户名和密码,还需要输入谷歌验证器上的动态密码。谷歌验证器上的动态密码,也称为一次性密码,密码按照时间或使用次数不断动态变化(默认 30 秒变更一次)

代码参考:https://github.com/PHPGangsta/GoogleAuthenticator

关键代码:

  1. <?php 
  2. // https://github.com/PHPGangsta/GoogleAuthenticator 
  3. error_reporting(0);// 关闭错误报告 
  4. session_start(); // 启动session   
  5. require_once 'PHPGangsta/GoogleAuthenticator.php'
  6. $ga = new PHPGangsta_GoogleAuthenticator(); 
  7. // $secret = $ga->createSecret(); 
  8. // 自定义安全密钥 
  9. $secret = "62H6TMAXQTZBVTRB"
  10. // 手机端扫描二维码获取动态口令 
  11. $qrCodeUrl = $ga->getQRCodeGoogleUrl('username'$secret); 
  12. echo "二维码地址: ".$qrCodeUrl."\n\n"
  13. // 输出动态口令 
  14. $oneCode = $ga->getCode($secret); 
  15. echo "本次登录的动态口令:'$oneCode'\n"
  16. // 动态口令认证 
  17. $checkResult = $ga->verifyCode($secret$password,2);    // 2 = 2*30sec clock tolerance 
  18. if ($checkResult) { 
  19.     $_SESSION['username'] = $username
  20.     echo "<h1>登录成功!</h1>"
  21.     header("Refresh: 5; url=main.php"); 
  22.     exit
  23. else { 
  24.     echo "<h1>登录失败!</h1>"
  25.     header("Refresh: 3; url=login.html"); 
  26.     exit
  27. ?> 

使用方法:

手机端安装 Microsoft Authenticator

下载地址:https://www.microsoft.com/en-us/security/mobile-authenticator-app

将以上代码生成的二维码地址在浏览器中访问

手机端扫描二维码获取动态验证码

代码示例:

login.html

  1. <!DOCTYPE html> 
  2. <html lang="en"> 
  3. <head> 
  4.     <meta charset="UTF-8"> 
  5.     <title>系统运维管理平台</title> 
  6.     <link rel="stylesheet" type="text/css" href="login.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" /> 
  7. </head> 
  8. <body> 
  9.     <div id="login"> 
  10.         <h1>Login</h1> 
  11.         <form method="post" action="login.php"> 
  12.             <input type="text" required="required" placeholder="用户名" name="username"></input> 
  13.             <input type="password" required="required" placeholder="密码" name="password"></input> 
  14.             <button class="but" type="submit">登录</button> 
  15.         </form> 
  16.     </div> 
  17. </body> 
  18. </html> 

login.php

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>系统运维管理平台</title> 
  6.     <link rel="stylesheet" type="text/css" href="login.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" /> 
  7. </head> 
  8. <body> 
  9. <div id="login"
  10. <?php 
  11. // https://github.com/PHPGangsta/GoogleAuthenticator 
  12. error_reporting(0);// 关闭错误报告 
  13. session_start(); // 启动session   
  14. require_once 'PHPGangsta/GoogleAuthenticator.php'
  15. $ga = new PHPGangsta_GoogleAuthenticator(); 
  16. // $secret = $ga->createSecret(); 
  17. # 自定义安全密钥 
  18. $secret = "62H6TMAXQTZBVTRB"
  19. // $qrCodeUrl = $ga->getQRCodeGoogleUrl('admin', $secret); 
  20. // echo "二维码: ".$qrCodeUrl."\n\n"; 
  21.  
  22. // 检查用户是否已经登录   
  23. if (isset($_SESSION['username'])) {   
  24.     // 用户已登录,显示用户信息或其他操作   
  25.     header("Refresh: 3; url=main.php"); 
  26. else {   
  27.     if(!isset($_SESSION['num'])){//isset() — 检测num变量是否设置。 
  28.         $_SESSION['num'] = 0; 
  29.     } 
  30.     // 密码输入错误3次,将不允许登录! 
  31.     if($_SESSION['num']<3){ 
  32.         if ($_SERVER['REQUEST_METHOD'] === 'POST') { 
  33.             $username = $_POST['username'];   
  34.             $password = $_POST['password'];   
  35.             //此处应该从数据库中查询是否存在系统用户,再进行口令验证 
  36.             if($username){ 
  37.                 $oneCode = $ga->getCode($secret); 
  38.                 echo "本次登录的动态口令:'$oneCode'\n"
  39.                 $checkResult = $ga->verifyCode($secret$password,2);    // 2 = 2*30sec clock tolerance 
  40.                 if ($checkResult) { 
  41.                     $_SESSION['username'] = $username
  42.                     echo "<h1>登录成功!</h1>"
  43.                     header("Refresh: 5; url=main.php"); 
  44.                     exit
  45.                 } else { 
  46.                     $_SESSION['num']++; 
  47.                     echo "<h1>登录失败!</h1>"
  48.                     header("Refresh: 3; url=login.html"); 
  49.                     exit
  50.                 } 
  51.             }else
  52.                 echo "<h1>登录失败!</h1>"
  53.                 header("Refresh: 3; url=login.html"); 
  54.                 exit
  55.             } 
  56.         } else {   
  57.             header("Location: login.html"); 
  58.             exit;  
  59.         } 
  60.     }else
  61.         echo "<h1>密码输入错误已超过3次,系统已不允许登录!</h1>"
  62.         header("Refresh: 3; url=login.html"); 
  63.         exit
  64.     } 
  65. ?> 
  66. </div> 
  67. </body> 
  68. </html> 

main.php

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>系统运维管理平台</title> 
  6.     <link rel="stylesheet" type="text/css" href="login.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" /> 
  7. </head> 
  8. <body> 
  9.     <div id="login"
  10.     <?php 
  11.     session_start(); // 启动session  
  12.     if (isset($_SESSION['username'])) {   
  13.         echo "<h2>".$_SESSION['username']."您已登录!</h2>"
  14.         echo "<h2><a href='logout.php'>退出登录</a></h2>"
  15.     } else
  16.         header("Refresh: 3; url=login.html"); 
  17.     } 
  18.     ?> 
  19. </body> 
  20. </html> 

logout.php

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>系统运维管理平台</title> 
  6.     <link rel="stylesheet" type="text/css" href="login.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" /> 
  7. </head> 
  8. <body> 
  9.     <div id="login"
  10.     <?php 
  11.         session_start(); 
  12.         if(isset($_SESSION['username'])) 
  13.         { 
  14.             session_destroy(); 
  15.         } 
  16.         header("Refresh: 3; url=login.html"); 
  17.     ?> 
  18. </body> 
  19. </html> 

login.css

  1. html{    
  2.     width100%;    
  3.     height100%;    
  4.     overflowhidden;    
  5.     font-stylesans-serif;    
  6. }    
  7. body{    
  8.     width100%;    
  9.     height100%;    
  10.     font-family'Open Sans',sans-serif;    
  11.     margin0;    
  12.     background-color#4A374A;    
  13. }    
  14. #login{    
  15.     positionabsolute;    
  16.     top: 50%;    
  17.     left:50%;    
  18.     margin-150px 0 0 -150px;    
  19.     width300px;    
  20.     height300px;    
  21. }    
  22. #login h1,h2{    
  23.     color#fff;    
  24.     /* text-shadow:0 0 10px;    */ 
  25.     letter-spacing1px;    
  26.     text-aligncenter;    
  27. }    
  28. h1,h2{    
  29.     font-size2em;    
  30.     margin0.67em 0;    
  31. }    
  32. input{    
  33.     width278px;    
  34.     height18px;    
  35.     margin-bottom10px;    
  36.     outlinenone;    
  37.     padding10px;    
  38.     font-size13px;    
  39.     color#fff;    
  40.     /* text-shadow:1px 1px 1px;    */ 
  41.     border-top1px solid #312E3D;    
  42.     border-left1px solid #312E3D;    
  43.     border-right1px solid #312E3D;    
  44.     border-bottom1px solid #56536A;    
  45.     border-radius: 4px;    
  46.     background-color#2D2D3F;    
  47. }    
  48. .but{    
  49.     width300px;    
  50.     min-height20px;    
  51.     displayblock;    
  52.     background-color#4a77d4;    
  53.     border1px solid #3762bc;    
  54.     color#fff;    
  55.     padding9px 14px;    
  56.     font-size15px;    
  57.     line-heightnormal;    
  58.     border-radius: 5px;    
  59.     margin0;    
  60. }

Tags: php动态口令认证

分享到: