php通過谷歌身份驗證實現動態口令

Google Authenticator,是谷歌推出的一款動態口令工具,解決大家的google賬戶遭到惡意攻擊的問題;許多安全性比較高的網站都會採用這種工具來驗證登錄或者交易;這個動態口令就是Google身份驗證器每隔30s會動態生成一個6位數的數字。它的作用是:對你的賬號進行“二步驗證”保護,或者說做一個雙重身份驗證,來達到提升安全級別的目的。

通過 一致算法保持手機端和服務端相同,並每30秒改變認證碼。

一致算法:

totp是基於時間的,htop是基於次數的。

祕鑰生成原理(基於時間)

1、時間戳,精確到微秒,除以1000,除以30(動態6位數字每30秒變化一次)

2、對時間戳餘數 hmac_sha1 編碼

3、然後 base32 encode 標準編碼

4、輸出大寫字符串,即祕鑰

動態6位數字驗證:

Google Authenticator會基於密鑰和時間計算一個HMAC-SHA1的hash值,這個hash是160 bit的,然後將這個hash值隨機取連續的4個字節生成32位整數,最後將整數取31位,再取模得到一個的整數。

這個就是Google Authenticator顯示的數字。

在服務器端驗證的時候,同樣的方法來計算出數字,然後比較計算出來的結果和用戶輸入的是否一致。

Google Authenticator PHP類

https://github.com/PHPGangsta/GoogleAuthenticator

生成安全碼並綁定手機

 

<?php

require_once './PHPGangsta/GoogleAuthenticator.php';

$ga = new PHPGangsta_GoogleAuthenticator();

// 創建新的"安全密匙SecretKey"
// 把本次的"安全密匙SecretKey" 入庫,和賬戶關係綁定,客戶端也是綁定這同一個"安全密匙SecretKey"
// 安全密匙SecretKey 可以和手機端綁定
$secret = $ga->createSecret();

echo "安全密匙SecretKey: " . $secret . "\n\n";

//第一個參數是"標識",第二個參數爲"安全密匙SecretKey" 生成二維碼信息
$qrCodeUrl = $ga->getQRCodeGoogleUrl('www.xxx.com', $secret);

//Google Charts接口 生成的二維碼圖片,方便手機端掃描綁定安全密匙SecretKey
echo "Google Charts URL for the QR-Code: " . $qrCodeUrl . "\n\n";

輸出:

 

安全密匙SecretKey: M5X3M4PGBQRFPUTY

Google Charts URL for the QR-Code: https://api.qrserver.com/v1/create-qr-code/?data=otpauth%3A%2F%2Ftotp%2Fwww.xxx.com%3Fsecret%3DM5X3M4PGBQRFPUTY&size=200x200&ecc=M

綁定手機方式

image.png

  • 通過安全祕鑰
  • 通過二維碼(圖片地址就是Google Charts生成的可以直接打開)

     

    image.png

動態口令驗證

image.png

 

<?php

require_once './PHPGangsta/GoogleAuthenticator.php';

$ga = new PHPGangsta_GoogleAuthenticator();

// 把提交的驗證碼和服務端上生成的驗證碼做對比
// $secret 服務端的 "安全密匙SecretKey"
// $oneCode 手機上看到的 "一次性驗證碼"
// 最後一個參數 爲容差時間,這裏是2 那麼就是 2* 30 sec 一分鐘.
$oneCode = '371922';
$secret = 'M5X3M4PGBQRFPUTY';

$checkResult = $ga->verifyCode($secret, $oneCode, 2);


if ($checkResult) {
    //這裏添加自定義邏輯
    echo '匹配! OK';
} else {
    echo '匹配! FAILED';
}

https://github.com/PHPGangsta/GoogleAuthenticator


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章