在各大互聯網平台中對於賬戶的安全性不容小噓,gmail v2ex 這些在使用的時候為了提高安全性經常會推薦綁定 google auth,用戶登錄或者其他操作的時候一個 token驗證.
原理
Google Authenticator 原理如下
Google的兩步驗證算法源自另一種名為HMAC-Based One-Time Password的算法,簡稱HOTP。HOTP的工作原理如下:
客戶端和服務器事先協商好一個密鑰K,用於一次性密碼的生成過程,此密鑰不被任何第三方所知道。此外,客戶端和服務器各有一個計數器C,並且事先將計數值同步。
進行驗證時,客戶端對密鑰和計數器的組合(K,C)使用HMAC(Hash-based Message Authentication Code)算法計算一次性密碼,公式如下:
HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))
上面采用了HMAC-SHA-1,當然也可以使用HMAC-MD5等。HMAC算法得出的值位數比較多,不方便用戶輸入,因此需要截斷(Truncate)成為一組不太長十進制數(例如6位)。計算完成之后客戶端計數器C計數值加1。用戶將這一組十進制數輸入並且提交之后,服務器端同樣的計算,並且與用戶提交的數值比較,如果相同,則驗證通過,服務器端將計數值C增加1。如果不相同,則驗證失敗。
這里的一個比較有趣的問題是,如果驗證失敗或者客戶端不小心多進行了一次生成密碼操作,那么服務器和客戶端之間的計數器C將不再同步,因此需要有一個重新同步(Resynchronization)的機制。這里不作具體介紹,詳情可以參看RFC 4226
備份
在跟服務器綁定的過程中一般是服務端會出現 密鑰K,你直接用 Google Auth app 掃碼就可以綁定,服務平台會提示讓你保存好這個密鑰K. 這個密鑰K 是你用於恢復 auth code 的. 但是當你綁定了很多驗證,並且不是每次都保存了這個密鑰k,這個時候你需要查看、遷移、保存某個auth code 對用的密鑰時候,這個就需要用到接下來的辦法.
- 打開 Google Authenticator 應用
- 點擊設置(三個點,右上角),選擇導出賬號
- 如果有授權提示,按照授權操作就可以了
- 選擇你要倒出的賬號,默認情況下為 所有賬戶
- 該應用會把你所有賬戶按照一定數量生成1個或幾個不同的QR碼的圖片
- 這里你可以選擇分別截屏保存下來或者用另外一台手機的微信掃碼功能,來掃這個QR碼,把掃出來的內容保存下來,內容前綴為 otpauth-migration://offline?data=
-
// clone google-auth OR碼工具 git clone https://github.com/krissrex/google-authenticator-exporter.git cd google-authenticator-exporter npm install .
- 上面步驟完成之后,輸入 npm run start 指令,這個時候會提示輸入 totpUri , 然后你就把 你保存下來的 以 otpauth-migration 開頭的內容粘貼到這里,按照提示操作,選擇倒出到文件還是輸出到控制台
- 其中內容中 totpSecret 就是你倒出的賬戶的對應的私鑰,這個要保存好!!!!
參考資料如下:
- TOTP: Time-based One-time Password Algorithm, RFC Draft, http://tools.ietf.org/id/draft-mraihi-totp-timebased-06.html
- HOTP: An HMAC-Based One-Time Password Algorithm, RFC 4226, http://tools.ietf.org/html/rfc4226
- Google Authenticator project, http://code.google.com/p/google-authenticator/