著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:徐小花
鏈接:http://www.zhihu.com/question/20462696/answer/18731073
來源:知乎
開啟Google的登陸二步驗證(即Google Authenticator服務)后用戶登陸時需要輸入額外由手機客戶端生成的一次性密碼。
實現Google Authenticator功能需要服務器端和客戶端的支持。服務器端負責密鑰的生成、驗證一次性密碼是否正確。客戶端記錄密鑰后生成一次性密碼。
目前客戶端有:
android版: Google 身份驗證器
iOS版: https://itunes.apple.com/cn/app/google-authenticator/id388497605
實現Google Authenticator功能需要服務器端和客戶端的支持。服務器端負責密鑰的生成、驗證一次性密碼是否正確。客戶端記錄密鑰后生成一次性密碼。
目前客戶端有:
android版: Google 身份驗證器
iOS版: https://itunes.apple.com/cn/app/google-authenticator/id388497605
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版的: https://github.com/PHPGangsta/GoogleAuthenticator 。上github搜索『Google Authenticator』可以找到更多語言版的Google Authenticator。
2.所以,你在自己的項目可以輕松加入對Google Authenticator的支持,在一個客戶端上顯示多個賬戶的效果可以看上面android版界面的截圖。目前dropbox、lastpass、wordpress,甚至vps等第三方應用都支持Google Authenticator登陸,請自行搜索。
3.現實生活中,網銀、網絡游戲的實體動態口令牌其實原理也差不多,大家可以自行腦補下,謝謝。
實現原理:
一、用戶需要開啟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版的: https://github.com/PHPGangsta/GoogleAuthenticator 。上github搜索『Google Authenticator』可以找到更多語言版的Google Authenticator。
2.所以,你在自己的項目可以輕松加入對Google Authenticator的支持,在一個客戶端上顯示多個賬戶的效果可以看上面android版界面的截圖。目前dropbox、lastpass、wordpress,甚至vps等第三方應用都支持Google Authenticator登陸,請自行搜索。
3.現實生活中,網銀、網絡游戲的實體動態口令牌其實原理也差不多,大家可以自行腦補下,謝謝。
