Android中Google Authenticator驗證系統工作原理分析
為了改進Android的安全問題,Google在Android系統中引入了谷歌驗證應用(Google Authenticator)來保證賬號的安全。谷歌驗證應用的使用方法是:使用者安裝手機客戶端,生成臨時身份驗證碼,提交到伺服器驗證身份,類似的驗證系統還有Authy。Robbie在其GitHub頁面釋出了自己用Go語言實現的版本,並撰寫了一篇博文來解釋其工作原理。
通常來講,身份驗證系統都實現了基於時間的一次性密碼演算法,即著名的TOTP(Time-Based One-Time Password)。該演算法由三部分組成:
- 一個共享金鑰(一系列二進位制資料)
- 一個基於當前時間的輸入
- 一個簽名函式
1、 共享金鑰
使用者在建立手機端身份驗證系統時需要獲取共享金鑰。獲取的方式包括用識別程式掃描給定二維碼或者直接手動輸入。金鑰是三十二位加密,至於為什麼不是六十四位,可以參考維基百科給出的解釋。
對於那些手動輸入的使用者,谷歌身份驗證系統給出的共享金鑰有如下的格式:
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
256位資料,當然別的驗證系統可能會更短。
而對於掃描的使用者,QR識別以後是類似下面的URL連結:
otpauth://totp/Google%3Ayourname@gmail.com?secret=xxxx&issuer=Google
2、 基於當前時間的輸入
這個輸入是基於使用者手機時間產生的,一旦使用者完成第一步的金鑰共享,就和身份驗證伺服器沒有關係了。但是這裡比較重要的是使用者手機時間要準確,因為從演算法原理來講,身份驗證伺服器會基於同樣的時間來重複進行使用者手機的運算。進一步來說,伺服器會計算當前時間前後幾分鐘內的令牌,跟使用者提交的令牌比較。所以如果時間上相差太多,身份驗證過程就會失敗。
3、 簽名函式
谷歌的簽名函式使用了HMAC-SHA1。HMAC即基於雜湊的訊息驗證碼,提供了一種演算法,可以用比較安全的單向雜湊函式(如SHA1)來產生簽名。這就是驗證演算法的原理所在:只有共享金鑰擁有者和伺服器才能夠根據同樣的輸入(基於時間的)得到同樣的輸出簽名。虛擬碼如下:
hmac = SHA1(secret + SHA1(secret + input))
本文開頭提到的TOTP和HMAC原理類似,只是TOTP強調輸入一定是當前時間相關。類似的還有HOTP,採用增量式計數器的方式,需要不斷和伺服器同步。
演算法流程簡介
首先需要用base32解碼金鑰,為了更方便使用者輸入,谷歌採用了空格和小寫的方式表示金鑰。但是base32不能有空格而且必須大寫,處理虛擬碼如下:
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret)))
接下來要從當前時間獲得輸入,通常採用Unix時間,即當前週期開始到現在的秒數
input = CURRENT_UNIX_TIME()
這裡有一點需要說明,驗證碼有一個時效,大概是30秒。這種設計是出於方便使用者輸入的考慮,每秒鐘變化的驗證碼很難讓使用者迅速準確輸入。為了實現這種時效性,可以通過整除30的方式來實現,即:
input = CURRENT_UNIX_TIME() / 30
最後一步是簽名函式,HMAC-SHA1,全部虛擬碼如下:
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret))) input = CURRENT_UNIX_TIME() / 30 hmac = SHA1(secret + SHA1(secret + input))
完成這些程式碼,基本就已經實現了兩次驗證的功能。由於HMAC是個標準長度的SHA1數值,有四十個字元的長度,使用者很難一次性正確輸入,因此還需要做一些格式上的處理。可參考下面的虛擬碼:
four_bytes = hmac[LAST_BYTE(hmac):LAST_BYTE(hmac) + 4] large_integer = INT(four_bytes) small_integer = large_integer % 1,000,000
相關文章
- time-based基於google key生成6位驗證碼(google authenticator)Go
- Google Authenticator implementation in PythonGoPython
- 2020-10-26 實驗五:NAT工作原理分析與驗證
- Linux下部署SSH登入時的二次身份驗證環境記錄(利用Google Authenticator)LinuxGo
- HTML5表單資訊驗證工作原理HTML
- Laravel 使用 Laravel-google-authenticator 擴充通過 Google 身份驗證器為你的網站打造一個動態手機令牌LaravelGo網站
- Laravel 使用 Laravel-google-authenticator 擴充透過 Google 身份驗證器為你的網站打造一個動態手機令牌LaravelGo網站
- 驗證碼原理及驗證
- 中安人證合一查驗系統
- 系統棧的工作原理
- 身份證號碼驗證系統
- [系統架構] AKKA工作原理架構
- Laravel 廣播系統工作原理Laravel
- 深入解析 Android 中 View 的工作原理AndroidView
- Docker 工作原理分析Docker
- _Authenticator
- 原始碼解析Android中AsyncTask的工作原理原始碼Android
- Google的kaptcha驗證碼使用GoAPT
- teams 更改密碼後無法登入,提示使用 Microsoft Authenticator 驗證問題密碼ROS
- Android IntentService 工作原理AndroidIntent
- 1.6.4. 作業系統驗證作業系統
- Symtavision — 分散式控制系統時間建模分析和驗證工具分散式
- Google資料:Android系統版本資料GoAndroid
- Google V8 引擎工作原理(翻譯)Go
- 一張圖揭祕Google眼鏡工作原理Go
- Android View 的工作原理AndroidView
- Linux ubi子系統原理分析Linux
- 谷歌OAuth驗證系統曝漏洞,惡意軟體能夠用以竊取Google帳戶谷歌OAuthGo
- 作業系統身份驗證和口令檔案身份驗證總結作業系統
- SCSI(小型計算機系統介面)工作原理計算機
- 影片直播系統原始碼,vue中captcha.js生成驗證碼原始碼VueAPTJS
- RxJs fromEvent 工作原理分析JS
- 在國內使用Google驗證碼reCaptchaGoAPT
- GoogleSEO工作基本原理是什麼?Go
- 驗證virtual函式的原理函式
- HACCP原理——驗證程式(轉載)
- Android 原始碼分析 --Handler 機制的實現與工作原理Android原始碼
- Symtavision—分散式嵌入式系統時間建模分析和驗證工具分散式