谷歌驗證 (Google Authenticator) 的實現原理是什么?


著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:徐小花
鏈接:http://www.zhihu.com/question/20462696/answer/18731073
來源:知乎

開啟Google的登陸二步驗證(即Google Authenticator服務)后用戶登陸時需要輸入額外由手機客戶端生成的一次性密碼。

實現Google Authenticator功能需要服務器端和客戶端的支持。服務器端負責密鑰的生成、驗證一次性密碼是否正確。客戶端記錄密鑰后生成一次性密碼。

目前客戶端有:
android版:  Google 身份驗證器
iOS版:
https://github.com/google/google-authenticator-android

實現原理:

一、用戶需要開啟Google Authenticator服務時,
1.服務器隨機生成一個類似於『DPI45HKISEXU6HG7』的密鑰,並且把這個密鑰保存在數據庫中。
2.在頁面上顯示一個二維碼,內容是一個URI地址(otpauth://totp/賬號?secret=密鑰),如『otpauth://totp/kisexu@gmail.com?secret=DPI45HCEBCJK6HG7』,下圖:

3.客戶端掃描二維碼,把密鑰『DPI45HKISEXU6HG7』保存在客戶端。

二、用戶需要登陸時
1.客戶端每30秒使用密鑰『DPI45HKISEXU6HG7』和時間戳通過一種『算法』生成一個6位數字的一次性密碼,如『684060』。如下圖android版界面:

2.用戶登陸時輸入一次性密碼『684060』。
3.服務器端使用保存在數據庫中的密鑰『DPI45HKISEXU6HG7』和時間戳通過同一種『算法』生成一個6位數字的一次性密碼。大家都懂控制變量法,如果算法相同、密鑰相同,又是同一個時間(時間戳相同),那么客戶端和服務器計算出的一次性密碼是一樣的。服務器驗證時如果一樣,就登錄成功了。

Tips:
1.這種『算法』是公開的,所以服務器端也有很多開源的實現,比如php版的:  。上github搜索『Google Authenticator』可以找到更多語言版的Google Authenticator。
2.所以,你在自己的項目可以輕松加入對Google Authenticator的支持,在一個客戶端上顯示多個賬戶的效果可以看上面android版界面的截圖。目前dropbox、lastpass、wordpress,甚至vps等第三方應用都支持Google Authenticator登陸,請自行搜索。
3.現實生活中,網銀、網絡游戲的實體動態口令牌其實原理也差不多,大家可以自行腦補下,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM