為了改進Android的安全問題,Google在Android系統(tǒng)中引入了谷歌驗證應(yīng)用(Google Authenticator)來保證賬號的安全。谷歌驗證應(yīng)用的使用方法是:用戶安裝手機客戶端,生成臨時身份驗證碼,提交到服務(wù)器驗證身份,類似的驗證系統(tǒng)還有Authy。Robbie在其GitHub頁面發(fā)布了自己用Go語言實現(xiàn)的版本,并撰寫了一篇博文來解釋其工作原理。
通常來講,身份驗證系統(tǒng)都實現(xiàn)了基于時間的一次性密碼算法,即著名的TOTP(Time-Based One-Time Password)。該算法由三部分組成:
1.一個共享密鑰(一系列二進制數(shù)據(jù))
2.一個基于當(dāng)前時間的輸入
3.一個簽名函數(shù)
1、 共享密鑰
用戶在創(chuàng)建手機端身份驗證系統(tǒng)時需要獲取共享密鑰。獲取的方式包括用識別程序掃描給定二維碼或者直接手動輸入。密鑰是三十二位加密,至于為什么不是六十四位,可以參考維基百科給出的解釋。
對于那些手動輸入的用戶,谷歌身份驗證系統(tǒng)給出的共享密鑰有如下的格式:
256位數(shù)據(jù),當(dāng)然別的驗證系統(tǒng)可能會更短。
而對于掃描的用戶,QR識別以后是類似下面的URL鏈接:
otpauth://totp/Google%3Ayourname@gmail.com?secret=xxxx&issuer=Google
2、 基于當(dāng)前時間的輸入
這個輸入是基于用戶手機時間產(chǎn)生的,一旦用戶完成第一步的密鑰共享,就和身份驗證服務(wù)器沒有關(guān)系了。但是這里比較重要的是用戶手機時間要準(zhǔn)確,因為從算法原理來講,身份驗證服務(wù)器會基于同樣的時間來重復(fù)進行用戶手機的運算。進一步來說,服務(wù)器會計算當(dāng)前時間前后幾分鐘內(nèi)的令牌,跟用戶提交的令牌比較。所以如果時間上相差太多,身份驗證過程就會失敗。
3、 簽名函數(shù)
谷歌的簽名函數(shù)使用了HMAC-SHA1。HMAC即基于哈希的消息驗證碼,提供了一種算法,可以用比較安全的單向哈希函數(shù)(如SHA1)來產(chǎn)生簽名。這就是驗證算法的原理所在:只有共享密鑰擁有者和服務(wù)器才能夠根據(jù)同樣的輸入(基于時間的)得到同樣的輸出簽名。偽代碼如下:
算法流程簡介
首先需要用base32解碼密鑰,為了更方便用戶輸入,谷歌采用了空格和小寫的方式表示密鑰。但是base32不能有空格而且必須大寫,處理偽代碼如下:
接下來要從當(dāng)前時間獲得輸入,通常采用Unix時間,即當(dāng)前周期開始到現(xiàn)在的秒數(shù)
新聞熱點
疑難解答
圖片精選