編輯:關於Android編程
為了改進Android的安全問題,Google在Android系統中引入了谷歌驗證應用(Google Authenticator)來保證賬號的安全。谷歌驗證應用的使用方法是:用戶安裝手機客戶端,生成臨時身份驗證碼,提交到服務器驗證身份,類似的驗證系統還有Authy。Robbie在其GitHub頁面發布了自己用Go語言實現的版本,並撰寫了一篇博文來解釋其工作原理。
通常來講,身份驗證系統都實現了基於時間的一次性密碼算法,即著名的TOTP(Time-Based One-Time Password)。該算法由三部分組成:
1.一個共享密鑰(一系列二進制數據)
2.一個基於當前時間的輸入
3.一個簽名函數
1、 共享密鑰
用戶在創建手機端身份驗證系統時需要獲取共享密鑰。獲取的方式包括用識別程序掃描給定二維碼或者直接手動輸入。密鑰是三十二位加密,至於為什麼不是六十四位,可以參考維基百科給出的解釋。
對於那些手動輸入的用戶,谷歌身份驗證系統給出的共享密鑰有如下的格式:
復制代碼 代碼如下:
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
256位數據,當然別的驗證系統可能會更短。
而對於掃描的用戶,QR識別以後是類似下面的URL鏈接:
otpauth://totp/Google%[email protected]?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
對於使用簽名的apk,常用的反編譯之後還是能查看class文件的代碼實現,對於反編譯可查看個人的博客點擊打開鏈接使用代碼混淆就能是這種常規反編譯失效1,在build.gr
最近在參加CSDN博客之星,希望大家給投一票,謝謝啦~ 點這裡投我一票吧~前言 在開發當中,我們常常需要實現文件上傳,比較常
先看看效果圖:實現思路:擦除圖片相應的角,然後層疊圖片,產生傾斜效果代碼實現:1、定義屬性在values文件夾下的attrs文件添加以下代碼<resources&g
我要自定義的控件是一個蓋世英雄,它不僅僅是一個Loading控件,同時還支持進度條 (ProgressBar)功能 。它會在你需要的時候出現,它支持 left,top,r