幾乎每一個(gè)App都離不開登錄注冊(cè)這個(gè)功能模塊,那么作為前端開發(fā),在實(shí)現(xiàn)登錄注冊(cè)的時(shí)候我們應(yīng)該進(jìn)行什么樣的處理,才能提高登錄注冊(cè)信息在數(shù)據(jù)傳輸過程中的安全性?這里我總結(jié)了以下幾個(gè)方面:
- “裸體”明文信息,直接將登錄注冊(cè)信息傳送給服務(wù)器;
- MD5加密處理后,傳輸給服務(wù)器;
- MD5和“固定鹽”加密處理后,傳輸給服務(wù)器;
- HMAC加密處理后,傳輸給服務(wù)器;
- 增添登錄請(qǐng)求的時(shí)效性。
“裸體”明文
這個(gè)沒什么好說的,如果你不是寫Demo的話,使用明文傳輸用戶信息,想想你的支付寶、銀行卡里面的錢不翼而飛,整天被各種銷售、房地產(chǎn)給你打電話吧。
MD5加密處理
通常在我們做開發(fā)前期,說到登錄注冊(cè)加密,可能最初都是使用MD5進(jìn)行加密的,并且以為天衣無縫,因?yàn)槲覀兌贾繫D5是不可逆的。但是:在計(jì)算機(jī)的世界里,哪有絕對(duì)的安全,無時(shí)無刻不是在進(jìn)行加護(hù)破解的博弈。MD5也是一樣的,針對(duì)MD5可以進(jìn)行暴力破解,至于如何暴力破解,這里附一個(gè)網(wǎng)址,它會(huì)告訴你一切
CMD5 : http://www.cmd5.com 。
MD5和“固定”鹽加密處理
鹽(Salt)
在密碼學(xué)中,是指通過在密碼任意固定位置插入特定的字符串,讓散列后的結(jié)果和使用原始密碼的散列結(jié)果不相符,這種過程稱之為“加鹽”。
?????????????????????????-----維基百科
static NSString * salt = @"ladsuf89asufiajfdi2oj3rw;oef()fkdk%^%839u48923ksjfklsdjflkf";
- (IBAction)login:(id)sender {
NSString * user = self.UserText.text;
pwd = [pwd stringByAppendingString:salt].md5String;
// do something
}
以上代碼塊,就是對(duì)明文密碼進(jìn)行加鹽MD5化,鹽Salt是前端和后臺(tái)服務(wù)器提前商定的結(jié)果。這樣的話,暴力破解的方式就幾乎可以避免(如果這樣還被暴力破解,只能說運(yùn)氣太差)。
這種方式在一定程度上降低了在傳輸過程中被中間人攻擊后破解得到原文的可能性。
當(dāng)然上面代碼塊的加密是最簡單的,在此基礎(chǔ)上,我們還可以延伸。比如將傳輸?shù)膮?shù)和鹽Salt進(jìn)行字典序排序后進(jìn)行MD5加密,獲取的字符串作為Signature簽名,然后再將Signature、參數(shù)和鹽進(jìn)行MD5加密,獲得最終的加密結(jié)果,進(jìn)行傳輸。傳輸?shù)胶笈_(tái)后,后臺(tái)會(huì)對(duì)傳輸信息進(jìn)行匹配。
但是:固定鹽加密的方式,有一個(gè)嚴(yán)重的弊端。就是固定,不可修改。如果我們的鹽Salt無意間泄漏,那么這就是一個(gè)大麻煩,因?yàn)槲覀冎暗挠脩裘艽a都是根據(jù)這個(gè)固定鹽生成,如果鹽Salt泄漏,當(dāng)我們想要替換之前的Salt時(shí),會(huì)造成之前所有注冊(cè)過的用戶密碼失效,這種后果的嚴(yán)重性,不用我說大家也都明白。而這種鹽泄漏的風(fēng)險(xiǎn)還是很高的,比如人為泄漏,比如反編譯泄漏(App被反編譯后,可以看到很多信息,而鹽,說不定就是其中一個(gè)。)
HMAC加密
- (IBAction)login:(id)sender {
NSString * user = self.UserText.text;
NSString * pwd = self.PwdText.text;
// 拿到注冊(cè)時(shí)從服務(wù)器獲取的密鑰Key
NSString * key = [KeyChain getSaltWithAccount:user];
if (key == nil) {
//1.發(fā)送網(wǎng)絡(luò)請(qǐng)求!獲取密鑰!!
key = [self getKeyWithAccunt:user];
//2.將密鑰存儲(chǔ)到KeyChain中
[KeyChain setSaltWithAccount:user];
}
//Hamc+key后的密碼,進(jìn)行網(wǎng)絡(luò)傳輸
pwd = [pwd hmacMD5StringWithKey:key];
以上代碼塊就是簡略的HMac和“動(dòng)態(tài)鹽”的加密方式。

特別說明一下登錄中步驟5:
當(dāng)我們注冊(cè)賬戶后,會(huì)將密鑰Key存儲(chǔ)在KeyChain中方便以后登錄取出使用,但是:當(dāng)我們更換設(shè)備時(shí),就取不到登錄所需的密鑰Key,針對(duì)這種情況,我們需要重新向服務(wù)器獲取賬戶對(duì)應(yīng)的密鑰Key,這個(gè)獲取的過程我們可以做成設(shè)備鎖,類似QQ那種效果的設(shè)備鎖。當(dāng)用戶重新獲取密鑰Key時(shí),需要注冊(cè)時(shí)填寫的手機(jī)號(hào)進(jìn)行短信驗(yàn)證或者回答注冊(cè)時(shí)填寫的一些信息。同樣,當(dāng)獲取到密鑰Key時(shí),需要存儲(chǔ)在設(shè)備的KeyChain中。
時(shí)效性
至此,我想我們的登錄請(qǐng)求的安全系數(shù)已經(jīng)提高了很多,但是還存在一定的風(fēng)險(xiǎn),比如當(dāng)中間人直接攔截獲取登錄授權(quán)信息,模擬成用戶操作。針對(duì)這種情況,我們可以對(duì)登錄請(qǐng)求增添時(shí)效性,過期不候。
具體就是在我們的HMAC加密過程中,加密參數(shù)增添一個(gè)時(shí)間戳,這個(gè)時(shí)間戳應(yīng)該是從服務(wù)器獲取的,客戶端的時(shí)間由于多方面原因吧,可能會(huì)造成和服務(wù)器時(shí)間不一致。當(dāng)客戶端將具有時(shí)效特性的信息傳輸給服務(wù)器后,服務(wù)器會(huì)根據(jù)規(guī)定的加密規(guī)則,進(jìn)行相同的算法,來和客戶端傳遞的數(shù)據(jù)相比對(duì)。這樣即使中間人截獲了登錄傳輸?shù)男畔?,如果是一個(gè)過期的數(shù)據(jù)信息,傳輸給服務(wù)器也是無效的。當(dāng)然這個(gè)有效時(shí)間也是客戶端和服務(wù)器的協(xié)定的。