两步验证杀手锏:Java 接入 Google 身份验证器实战
轉(zhuǎn)載自? ?兩步驗(yàn)證殺手锏:Java 接入 Google 身份驗(yàn)證器實(shí)戰(zhàn)
什么是兩步驗(yàn)證?
大家應(yīng)該對(duì)兩步驗(yàn)證都熟悉吧?如蘋果有自帶的兩步驗(yàn)證策略,防止用戶賬號(hào)密碼被盜而鎖定手機(jī)進(jìn)行敲詐,這種例子屢見不鮮,所以蘋果都建議大家開啟兩步驗(yàn)證的。
Google 的身份驗(yàn)證器一般也是用于登錄進(jìn)行兩步驗(yàn)證,和蘋果的兩步驗(yàn)證是同樣的道理。只不過 Google 的身份驗(yàn)證器用得更多更廣泛,如 GitHub 的兩步驗(yàn)證都是基于 Google 身份驗(yàn)證器。
Google Authenticator 簡(jiǎn)介
Google Authenticator 身份驗(yàn)證器是一款基于時(shí)間與哈希的一次性密碼算法的兩步驗(yàn)證軟件令牌,用戶需要下載手機(jī) APP(Authenticator),該手機(jī) APP 與網(wǎng)站進(jìn)行綁定,當(dāng)網(wǎng)站驗(yàn)證完用戶名和密碼之后會(huì)驗(yàn)證此 APP 上對(duì)應(yīng)生成的 6 位驗(yàn)證碼數(shù)字,驗(yàn)證通過則成功登錄,否則登錄失敗。
Google Authenticator 使用
我們來看下 Github 上的使用 Google 身份驗(yàn)證器開啟兩步驗(yàn)證的應(yīng)用。
如圖所示,默認(rèn) Github 是沒有開啟兩步驗(yàn)證的,點(diǎn)擊設(shè)置按鈕進(jìn)行設(shè)置。
Github 提供了基于 APP (谷歌身份驗(yàn)證器)和短信驗(yàn)證碼兩種兩步驗(yàn)證的方式,我們選擇第一種谷歌身份驗(yàn)證器。
進(jìn)入第一種驗(yàn)證模式,接下來展示了一堆的恢復(fù)碼,用來當(dāng) APP 驗(yàn)證器不能工作的緊急情況使用。把它們保存起來,然后點(diǎn)擊下一步。
這個(gè)就是身份驗(yàn)證器的關(guān)鍵了,下載 Google 的?Authenticator?APP,然后掃描這個(gè)二維碼進(jìn)行綁定。
?
綁定之后,APP Github 模塊下面會(huì)顯示一個(gè) 6 位的驗(yàn)證碼,把它輸入到上面那個(gè)框里面就行了。
?
如下圖所示,已經(jīng)成功開啟兩步驗(yàn)證了。
?
接下來我們退出 Github 再重新登錄,頁(yè)面就會(huì)提示要輸入 Google 的身份驗(yàn)證器驗(yàn)證碼了,如果 APP 不能正常工作,最下方還能通過之前保存下來的恢復(fù)碼進(jìn)行登錄。
好了,Google Authenticator 使用就到這里,那它是如何工作的,它是什么原理呢?我們的網(wǎng)站、APP 如何接入 Google Authenticator,接下來我們一一拉開謎底。
Google Authenticator 工作流程
實(shí)際上 Google Authenticator 采用的是 TOTP 算法(Time-Based One-Time Password,即基于時(shí)間的一次性密碼),其核心內(nèi)容包括以下三點(diǎn)。
1、安全密鑰
是客戶端和服務(wù)端約定的安全密鑰,也是手機(jī)端 APP 身份驗(yàn)證器綁定(手機(jī)端通過掃描或者手輸安全密鑰進(jìn)行綁定)和驗(yàn)證碼的驗(yàn)證都需要的一個(gè)唯一的安全密鑰,該密鑰由加密算法生成,并最后由 Base32 編碼而成。
2、驗(yàn)證時(shí)間
Google 選擇了 30 秒作為時(shí)間片,T的數(shù)值為 從Unix epoch(1970年1月1日 00:00:00)來經(jīng)歷的 30 秒的個(gè)數(shù),所以在 Google Authenticator 中我們可以看見驗(yàn)證碼每個(gè) 30 秒就會(huì)刷新一次。
更詳細(xì)原理參考:
https://blog.seetee.me/post/2011/google-two-step-verification/
3、簽署算法
Google 使用的是 HMAC-SHA1 算法,全稱是:Hash-based message authentication code(哈希運(yùn)算消息認(rèn)證碼),它是以一個(gè)密鑰和一個(gè)消息為輸入,生成一個(gè)消息摘要作為輸出,這里以 SHA1 算法作為消息輸入。
使用 HMAC 算法是因?yàn)橹挥杏脩舯旧碇勒_的輸入密鑰,因此會(huì)得到唯一的輸出,其算法可以簡(jiǎn)單表示為:
hmac = SHA1(secret + SHA1(secret + input))
事實(shí)上,TOTP 是 HMAC-OTP(基于HMAC的一次密碼生成)的超集,區(qū)別是 TOTP 是以當(dāng)前時(shí)間作為輸入,而HMAC-OTP 則是以自增計(jì)算器作為輸入,該計(jì)數(shù)器使用時(shí)需要進(jìn)行同步。
Google Authenticator 實(shí)戰(zhàn)
知道上面的原理,我們就可以來應(yīng)用實(shí)戰(zhàn)了。
/***?微信公眾號(hào):Java技術(shù)棧*/ public?class?AuthTest?{@Testpublic?void?genSecretTest()?{String?secret?=?GoogleAuthenticator.generateSecretKey();String?qrcode?=?GoogleAuthenticator.getQRBarcodeURL("Java技術(shù)棧",?"javastack.cn",?secret);System.out.println("二維碼地址:"?+?qrcode);System.out.println("密鑰:"?+?secret);}@Testpublic?void?verifyTest()?{String?secret?=?"ZJTAQGLVOZ7ATWH2";long?code?=?956235;GoogleAuthenticator?ga?=?new?GoogleAuthenticator();boolean?r?=?ga.verifCode(secret,?code);System.out.println("是否正確:"?+?r);} }第一個(gè)方法是生成密鑰和一個(gè)掃描二維碼綁定的URL。
第二個(gè)方法是根據(jù)密鑰和驗(yàn)證碼進(jìn)行驗(yàn)證。
這里僅提供一下 GoogleAuthenticator 類的源碼邏輯參考。
http://awtqty-zhang.iteye.com/blog/1986275
總結(jié)
以上是生活随笔為你收集整理的两步验证杀手锏:Java 接入 Google 身份验证器实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公司网址怎么优化(公司网址怎么优化设置)
- 下一篇: java美元兑换,(Java实现) 美元