一蘑志、雙因素認證
什么是雙因素認證(Two-factor authentication,簡稱 2FA)
解釋一(引自百度百科)
雙因素身份認證就是:通過你所知道再加上你所能擁有的媒咳,這二個要素組合到一起才能發(fā)揮作用的身份認證系統(tǒng)英染。雙因素認證是一種采用時間同步技術(shù)的系統(tǒng)东羹,采用了基于時間帐我、事件和密鑰三變量而產(chǎn)生的一次性密碼來代替?zhèn)鹘y(tǒng)的靜態(tài)密碼许赃。每個動態(tài)密碼卡都有一個唯一的密鑰跟压,該密鑰同時存放在服務(wù)器端,每次認證時動態(tài)密碼卡與服務(wù)器分別根據(jù)同樣的密鑰塞茅,同樣的隨機參數(shù)(時間亩码、事件)和同樣的算法計算了認證的動態(tài)密碼,從而確保密碼的一致性野瘦,從而實現(xiàn)了用戶的認證描沟。---引自
百度百科
解釋二(引自阮一峰的網(wǎng)絡(luò)日志)
一般來說,三種不同類型的證據(jù),可以證明一個人的身份吏廉。
秘密信息:只有該用戶知道蠢络、其他人不知道的某種信息,比如密碼迟蜜。
個人物品:該用戶的私人物品刹孔,比如身份證、鑰匙娜睛。
生理特征:該用戶的遺傳特征髓霞,比如指紋、相貌畦戒、虹膜等等方库。這些證據(jù)就稱為三種"因素"(factor)。因素越多障斋,證明力就越強纵潦,身份就越可靠。
雙因素認證就是指垃环,通過認證同時需要兩個因素的證據(jù)邀层。
銀行卡
就是最常見的雙因素認證。用戶必須同時提供銀行卡和密碼遂庄,才能取到現(xiàn)金寥院。
二、TOTP和Google authenticator簡介
TOTP
是什么涛目?簡單的說秸谢,是一次性密碼;全稱是"基于時間的一次性密碼"(Time-based One-time Password)霹肝。它是公認的可靠解決方案估蹄,已經(jīng)寫入國際標(biāo)準(zhǔn)RFC6238。Google authenticator
又是什么沫换?是一個基于TOTP原理實現(xiàn)的一個生成一次性密碼的工具臭蚁,用來做雙因素登錄,也是一個開源的項目苗沧。比如阿里的身份寶就是兼容Google authenticator
的一個TOTP工具刊棕。
實現(xiàn)TOTP功能需要服務(wù)器端和客戶端的支持炭晒。服務(wù)器端負責(zé)密鑰的生成待逞、驗證一次性密碼是否正確⊥希客戶端記錄密鑰后生成一次性密碼识樱。
1、使用一次一密基本的流程:
1.在服務(wù)器端對每個用戶生成一個密鑰SecretKey,這個密鑰對于每個用戶是不同的怜庸。
2.用戶在自己的手機上安裝客戶端当犯。第一次使用這個系統(tǒng)的時候,將密鑰輸入到客戶端割疾。服務(wù)器和用戶的手機嚎卫,現(xiàn)在都有了同一把密鑰。這里有兩種輸入方式宏榕,可以手動的輸入拓诸,也可以由系統(tǒng)生成二維碼,客戶端可以直接掃描二維碼來讀取密鑰信息和帳號信息麻昼;同時可以設(shè)置一些參數(shù)奠支,比如一次一密的長度(默認為6),時間步長(默認為30s)等抚芦。注意倍谜,密鑰必須跟手機綁定。一旦用戶更換手機叉抡,就必須生成全新的密鑰
尔崔。
3.客戶端每隔一段時間為系統(tǒng)自動生成一個新的密碼。系統(tǒng)驗證的時候褥民,用戶輸入客戶端中的數(shù)字密碼來驗證您旁。
2、TOTP算法
其核心內(nèi)容包括以下三點:
一個共享密鑰(一個比特序列)轴捎;
當(dāng)前時間輸入鹤盒;
一個簽署函數(shù)。
對于同一個用戶侦副,服務(wù)器和客戶端共享了一個密鑰SecretKey侦锯,二是服務(wù)器和客戶端有相同的時間。
1.客戶端和服務(wù)端使用HMACSHA1 這個加密算法進行加密秦驯,首先客戶端和服務(wù)端會商量一個key尺碰,然后把這個key Base32之后當(dāng)作算法的加密key
2.然后客戶端和服務(wù)端需要維持一個long state一個值,如果服務(wù)端和客戶端不能夠通信译隘,那么其實用時間當(dāng)作這個state即可亲桥,當(dāng)然這個得保證估計幾十秒的容錯性,一旦時間誤差比較大就會驗證不通過固耘,這個就是TOTP的缺點题篷。
3.雙方通過加密這個long state 得到統(tǒng)一加密后的數(shù)據(jù)byte[] hash,首先取byte[] hash的最后一個byte& 0xF,那么就是去掉高位厅目,留下一個小于15的數(shù)字offset番枚,然后通過截取hash[offset:length]法严,這部分byte[]數(shù)組轉(zhuǎn)換成數(shù)字truncatedHash,最后根據(jù)設(shè)置的返回碼的位數(shù)葫笼,來決定取truncatedHash中的多少位深啤。
整個算法流程就是上面這三步,這里面有一個難點路星,就是保證時間的容錯性溯街,
GoogleAuthenticator流程
1、基于密鑰和時間計算一個HMAC-SHA1的hash值洋丐,這個hash是160bit的
2苫幢、將這個hash值隨機取連續(xù)的4個字節(jié)生成32位整數(shù),最后將整數(shù)取31位垫挨,再取模得到一個的整數(shù)韩肝。這個就是GoogleAuthenticator顯示的數(shù)字。
3九榔、在服務(wù)器端驗證的時候哀峻,同樣的方法來計算出數(shù)字
4、比較計算出來的結(jié)果和用戶輸入的是否一致哲泊。
3剩蟀、示例
創(chuàng)建二維碼或密鑰,添加到手機Authenticator中切威,用手機中得到的code與用戶和密鑰進行驗證即可育特。
<?php
require_once 'PHPGangsta/GoogleAuthenticator.php';
$ga = new PHPGangsta_GoogleAuthenticator();
$secret = $ga->createSecret();
//這是生成的密鑰,每個用戶唯一一個先朦,為用戶保存起來
echo $secret; echo '<br />';
//下面為生成二維碼缰冤,內(nèi)容是一個URI地址(otpauth://totp/賬號?secret=密鑰&issuer=標(biāo)題)
//例子:otpauth://totp/zjwlgr@163.com?secret=6HPH5373NXGO6M7K&issuer=zjwlgr
$qrCodeUrl = $ga->getQRCodeGoogleUrl('zjwlgr@163.com', $secret, 'kuaxue');
echo "Google Charts URL for the QR-Code: ".$qrCodeUrl."\n\n";
//下面為驗證參數(shù)
$oneCode = $_GET['code'];//用戶手機中獲取的code
$secret = '6HPH5373NXGO6M7K';//用戶唯一一個密鑰,上面生成的
//下面為驗證用戶輸入的code是否正確
$checkResult = $ga->verifyCode($secret, $oneCode, 2); // 2 = 2*30秒 時鐘容差
echo '<br />';
if ($checkResult) {
echo 'OK';
} else {
echo 'FAILED';
}
此段程序這是一個PHP實現(xiàn)的調(diào)用方法喳魏,引用自https://github.com/PHPGangsta/GoogleAuthenticator
棉浸,可以把這個clone到你本地使用。
三刺彩、雙因素認證總結(jié)
1迷郑、優(yōu)點
比單純的密碼登錄安全得多。就算密碼泄露创倔,只要手機還在嗡害,賬戶就是安全的。各種密碼破解方法畦攘,都對雙因素認證無效霸妹。
2、缺點
登錄多了一步念搬,費時且麻煩抑堡,用戶會感到不耐煩。而且朗徊,它也不意味著賬戶的絕對安全首妖,入侵者依然可以通過盜取 cookie 或 token,劫持整個對話(session)爷恳。
3有缆、帳戶恢復(fù)問題
這是雙因素認證最大的一個問題。
一旦忘記密碼或者遺失手機温亲,想要恢復(fù)登錄棚壁,勢必就要繞過雙因素認證,這就形成了一個安全漏洞栈虚。
除非
準(zhǔn)備兩套
雙因素認證袖外,一套用來登錄,另一套用來恢復(fù)賬戶魂务。
四曼验、參考
1、php使用谷歌驗證 (Google Authenticator) 的雙重身份驗證
2粘姜、使用google authenticator打造運維平臺的動態(tài)口令
3鬓照、google authenticator 工作原理
4、詳解Google Authenticator工作原理
5孤紧、谷歌驗證 (Google Authenticator) PHP版
6豺裆、基于Google 驗證器 實現(xiàn)內(nèi)網(wǎng)的雙因素認證
7、谷歌驗證:不懂備份号显,人財兩空【更新小程序使用方法】
8臭猜、Google Authenticator Question
9、雙因素認證(2FA)教程