Android中新引進的Google Authenticator驗證系統工作原理淺析_Android

來源:互聯網
上載者:User

為了改進Android的安全問題,Google在Android系統中引入了Google驗證應用(Google Authenticator)來保證帳號的安全。Google驗證應用的使用方法是:使用者安裝手機用戶端,產生臨時身分識別驗證碼,提交到伺服器驗證身份,類似的驗證系統還有Authy。Robbie在其GitHub頁面發布了自己用Go語言實現的版本,並撰寫了一篇博文來解釋其工作原理。

通常來講,身分識別驗證系統都實現了限時單次密碼演算法,即著名的TOTP(Time-Based One-Time Password)。該演算法由三部分組成:

1.一個共用密鑰(一系列位元據)
2.一個基於目前時間的輸入
3.一個簽名函數

1、 共用密鑰

使用者在建立手機端身分識別驗證系統時需要擷取共用密鑰。擷取的方式包括用識別程式掃描給定二維碼或者直接手動輸入。密鑰是三十二位加密,至於為什麼不是六十四位,可以參考維基百科給出的解釋。

對於那些手動輸入的使用者,Google身分識別驗證系統給出的共用密鑰有如下的格式:

複製代碼 代碼如下:

xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

256位元據,當然別的驗證系統可能會更短。

而對於掃描的使用者,QR識別以後是類似下面的URL連結:

otpauth://totp/Google%3Ayourname@gmail.com?secret=xxxx&issuer=Google

2、 基於目前時間的輸入

這個輸入是基於使用者手機時間產生的,一旦使用者完成第一步的密鑰共用,就和驗證服務器沒有關係了。但是這裡比較重要的是使用者手機時間要準確,因為從演算法原理來講,驗證服務器會基於同樣的時間來重複進行使用者手機的運算。進一步來說,伺服器會計算目前時間前後幾分鐘內的令牌,跟使用者提交的令牌比較。所以如果時間上相差太多,身分識別驗證過程就會失敗。

3、 簽名函數

Google的簽名函數使用了HMAC-SHA1。HMAC即基於雜湊的訊息驗證碼,提供了一種演算法,可以用比較安全的單向雜湊函數(如SHA1)來產生簽名。這就是驗證演算法的原理所在:只有共用密鑰擁有者和伺服器才能夠根據同樣的輸入(基於時間的)得到同樣的輸出簽名。虛擬碼如下:

複製代碼 代碼如下:

hmac = SHA1(secret + SHA1(secret + input))

本文開頭提到的TOTP和HMAC原理類似,只是TOTP強調輸入一定是目前時間相關。類似的還有HOTP,採用增量式計數器的方式,需要不斷和伺服器同步。

演算法流程簡介

首先需要用base32解碼密鑰,為了更方便使用者輸入,Google採用了空格和小寫方式表示密鑰。但是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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.