Google身份驗(yàn)證器Google Authenticator是谷歌推出的基于時(shí)間的一次性密碼(Time-based One-time Password,簡稱TOTP),只需要在手機(jī)上安裝該APP,就可以生成一個(gè)隨著時(shí)間變化的一次性密碼,用于帳戶驗(yàn)證。
簡介Google身份驗(yàn)證器是一款基于時(shí)間與哈希的一次性密碼算法的兩步驗(yàn)證軟件令牌,此軟件用于Google的認(rèn)證服務(wù)。此項(xiàng)服務(wù)所使用的算法已列于RFC 6238和RFC 4226中。
Google身份驗(yàn)證器給予用戶一個(gè)六位到八位的一次性密碼用于進(jìn)行登錄Google或其他站點(diǎn)時(shí)的附加驗(yàn)證。其同樣可以給第三方應(yīng)用生成口令,例如密碼管家程序或網(wǎng)絡(luò)硬盤。先前版本的Google身份驗(yàn)證器開放源代碼,但之后的版本以專有軟件的形式公開。1
典型使用情況通常,用戶安裝身份驗(yàn)證程序在智能手機(jī)上。為了登錄到使用兩步驗(yàn)證的網(wǎng)站或服務(wù)上,用戶提供用戶名和密碼后運(yùn)行身份驗(yàn)證器進(jìn)行額外驗(yàn)證。該應(yīng)用程序會(huì)生成六位數(shù)的一次性密碼,而不同網(wǎng)站可能會(huì)生成同一密碼。
為了使身份驗(yàn)證器正常工作,安裝運(yùn)行之前網(wǎng)站必須向用戶提供一組共享密鑰。這組密鑰將會(huì)用于未來的所有登陸請(qǐng)求。
在兩步驗(yàn)證的保護(hù)之下,僅僅擁有用戶名密碼已不足以黑入賬戶。攻擊者需要這組共享密鑰或者拿到進(jìn)行兩步驗(yàn)證的移動(dòng)設(shè)備。另一種方法是進(jìn)行中間人攻擊;若用戶的電腦被木馬侵入,則用戶名、密碼及一次性密碼都將被木馬所捕獲,隨后攻擊者即可利用木馬進(jìn)行登錄、監(jiān)聽或修改用戶與網(wǎng)站的通信。2
Android上的開源情況Google身份驗(yàn)證器在Google Play商店上目前(2017年9月16日)以私有版權(quán)協(xié)議發(fā)布。Google在GitHub上開放了其身份驗(yàn)證器源代碼,并陳述如下:
“此開源計(jì)劃包含了2.21版本的源代碼。隨后的版本中包含了Google特有的工作流程,與此項(xiàng)目無關(guān)?!?/p>
Android版本的獨(dú)立分支之一為FreeOTP,其基于Google在GitHub上所開源的最新版本。另外一個(gè)并非很火的分支OTP Authenticator也在Google Play上可供下載。3
技術(shù)說明服務(wù)提供商為每個(gè)用戶生成80位的密鑰(然而RFC 4226 §4要求使用128位并建議使用160位密鑰)。它以16位、26位或者32位base32的字符串亦或是二維碼的方式提供出來??蛻舳耸褂么嗣荑€生成HMAC-SHA1。經(jīng)過HMAC處理過的信息可能為:
自UNIX時(shí)間(TOTP)起始之后所經(jīng)過的30秒周期數(shù)
隨著每個(gè)新密碼所增加的計(jì)數(shù)(HOTP)
一段哈希值被提取出來并轉(zhuǎn)換為6位數(shù)密碼。3
生成一次性密碼的偽代碼 function GoogleAuthenticatorCode(string secret) key := base32decode(secret) message := floor(current Unix time / 30) hash := HMAC-SHA1(key, message) offset := last nibble of hash truncatedHash := hash[offset..offset+3] //4 bytes starting at the offset Set the first bit of truncatedHash to zero //remove the most significant bit code := truncatedHash mod 1000000 pad code with 0 until length of code is 6 return code生成事件性或計(jì)數(shù)性的一次性密碼偽代碼 function GoogleAuthenticatorCode(string secret) key := base32decode(secret) message := counter encoded on 8 bytes hash := HMAC-SHA1(key, message) offset := last nibble of hash truncatedHash := hash[offset..offset+3] //4 bytes starting at the offset Set the first bit of truncatedHash to zero //remove the most significant bit code := truncatedHash mod 1000000 pad code with 0 until length of code is 6 return code本詞條內(nèi)容貢獻(xiàn)者為:
宋春霖 - 副教授 - 江南大學(xué)