程序員過(guò)關(guān)斬將--少年派登錄安全的奇幻遐想
“據(jù)說(shuō),這篇也是快餐,完全符合年輕人口味
說(shuō)到登錄,無(wú)人不知無(wú)人不曉。每一個(gè)有用戶體系的相關(guān)系統(tǒng)都會(huì)有登錄的入口,登錄是為了確認(rèn)操作人的正確性。說(shuō)到登錄安全,其實(shí)是一個(gè)很偉大的命題,不過(guò)常用的手段也不過(guò)爾爾。
避免明文
這個(gè)設(shè)計(jì)到用戶憑證信息的表設(shè)計(jì),切記避免明文存儲(chǔ)用戶的密碼信息。還記得以前很多大廠的密碼泄露事件嗎?
在數(shù)據(jù)表的設(shè)計(jì)中,除了用戶密碼的摘要列之外,需要添加所謂的“salt”列,其實(shí)是隨機(jī)生成的一個(gè)字符串,用于和用戶密碼的摘要聯(lián)合生成最終的摘要。
loginName | salt | pwd |
---|---|---|
182xxxxxxxx | 隨機(jī)字符串 | 散列值 |
182xxxxxxxx | 隨機(jī)字符串 | 散列值 |
如果非要寫一個(gè)過(guò)程的話:
- 當(dāng)用戶首次注冊(cè)的時(shí)候,系統(tǒng)隨機(jī)生成salt,然后和密碼按照規(guī)則拼接成一個(gè)字符串,然后求散列值,并存儲(chǔ)在pwd列中
- 客戶端請(qǐng)求登陸接口,上傳用戶的賬號(hào)和密碼,這里的密碼推薦md5的摘要(js也可以生成md5)
- 服務(wù)端接收到請(qǐng)求,根據(jù)用戶的賬號(hào)查詢對(duì)應(yīng)的salt
- 把上傳的密碼和salt根據(jù)規(guī)則拼接,然后生成摘要
- 把上一步生成的摘要和數(shù)據(jù)庫(kù)的pwd進(jìn)行對(duì)比,相同則登錄成功,不同則登錄失敗
為什么非要加入salt呢?有了salt不僅可以加大黑客破解的難度,而且同樣密碼的用戶存儲(chǔ)的pwd列也不相同,在用戶信息安全性上又提高了一點(diǎn)。
驗(yàn)證碼
驗(yàn)證碼是一種比較廉價(jià)的但是很有效的防止別人亂搞的手段,它通過(guò)一種只有真人才能識(shí)別的防偽手段來(lái)阻止危險(xiǎn)。
image
以上是12306的登錄界面,看驗(yàn)證碼的方式,是不是已經(jīng)騷到了極點(diǎn)。如果你的登錄接口不希望別人暴力破解的話,驗(yàn)證碼是必須的。
對(duì)于普通的網(wǎng)站,驗(yàn)證碼程序其實(shí)可以做的很簡(jiǎn)單就足夠用了,就像以下
image
用到的技術(shù)是服務(wù)端把驗(yàn)證碼的內(nèi)容繪制在一張帶有紋路的圖片上,把碼的內(nèi)容存儲(chǔ)在一個(gè)地方,并分配一個(gè)key,把這個(gè)key返回客戶端,當(dāng)客戶端登錄的時(shí)候攜帶者這個(gè)key和用戶填入的驗(yàn)證碼內(nèi)容來(lái)確定驗(yàn)證碼是否正確。
“我曾經(jīng)看過(guò)有人把驗(yàn)證碼的校驗(yàn)放到客戶端,要記住,客戶端其實(shí)是無(wú)安全可言的,哪怕是那些做了混淆的App。
手機(jī)驗(yàn)證碼
目前幾乎所有的系統(tǒng)都支持手機(jī)驗(yàn)證碼登錄,為什么這么普及是有原因的。
- 首先,這種方式便捷,用戶無(wú)需記住密碼,試想一下,用戶要記住自己常用的幾十個(gè)網(wǎng)站密碼是很難的,而且手機(jī)現(xiàn)在幾乎都不離身
- 其次,手機(jī)驗(yàn)證碼方式安全系數(shù)比較高,因?yàn)槭謾C(jī)號(hào)現(xiàn)在都采用了實(shí)名制,手機(jī)號(hào)被盜的可能性比較小,而且現(xiàn)在的手機(jī)都有指紋鎖,就算手機(jī)丟了也不怕
- 最后,系統(tǒng)都采用手機(jī)號(hào)登錄,可以高效的拉進(jìn)和用戶的距離,而且也有利于國(guó)家的監(jiān)管工作,畢竟根據(jù)手機(jī)號(hào)就可以追蹤到用戶的所有信息了
設(shè)備號(hào)
登錄的時(shí)候把當(dāng)前設(shè)備的標(biāo)識(shí)上傳到服務(wù)端進(jìn)行識(shí)別,我覺(jué)得對(duì)于登錄來(lái)說(shuō)很重要。為什么呢?
在現(xiàn)在App漫天飛的時(shí)代,在App上是要實(shí)現(xiàn)自動(dòng)登錄的,換句話說(shuō),用戶登錄過(guò)一次這個(gè)App,當(dāng)用戶下次打開的時(shí)候,需要實(shí)現(xiàn)自動(dòng)登錄,這在用戶體驗(yàn)上會(huì)比每次都登錄好很多。但是這就面臨著一個(gè)問(wèn)題:需要把用戶登錄的憑證保存在本地,切換到瀏覽器中,這些憑證信息可能會(huì)保存在Cookie中或者local storage中,當(dāng)然憑證肯定是要加密的。我們要保證的是這些憑證就算是被黑客知道了,也不能正常登錄。
那怎么才能保證呢?答案是設(shè)備。在用戶的登錄請(qǐng)求中一定要上傳設(shè)備號(hào)(瀏覽器也可以用js生成的),服務(wù)端存儲(chǔ)著用戶的有效設(shè)備列表,當(dāng)然這個(gè)有效設(shè)備需要產(chǎn)品經(jīng)理給出明確的定義,比如最常見(jiàn)的:登錄過(guò)5次的設(shè)備。當(dāng)然說(shuō)到設(shè)備還有一個(gè)主設(shè)備的概念,至于怎么樣才能定義主設(shè)備,也是需要產(chǎn)品方給出定義的,像最常見(jiàn)的:手機(jī)端是主設(shè)備。像微信現(xiàn)在登錄pc端是需要手機(jī)端掃碼的,切換到業(yè)務(wù),可以看做需要主設(shè)備確認(rèn)的請(qǐng)求才能執(zhí)行。
安全設(shè)備概念在多點(diǎn)登錄的場(chǎng)景下非常有用,尤其是需要互踢的需求下。
登錄時(shí)間
服務(wù)端一定要記住用戶最后一次的登錄時(shí)間,在很多情況下需要記住用戶在某個(gè)設(shè)備上的最后登錄時(shí)間。這樣做不止是為了記錄分析用戶的登錄行為,還可以分析長(zhǎng)期未登錄的用戶,使他的登錄憑據(jù)失效,強(qiáng)制他重新登錄。
HTTPS
雖然一個(gè)證書每幾個(gè)錢,但是https起到的作用在安全性上還是很大的。本質(zhì)上它采用的也是加密算法,比http要耗費(fèi)cpu,傳輸速度上要慢一些。但是它可以有效的防止中間人劫持,防止用戶信息外漏,而且可以防止被釣魚網(wǎng)站攻擊,有效識(shí)別網(wǎng)站真實(shí)身份,像其他的有利于SEO,地址欄出現(xiàn)安全鎖等就不說(shuō)了。
寫在最后
以上所說(shuō)只是一些最常見(jiàn)的手段,除此之外,比如IP黑名單機(jī)制,限流機(jī)制等都可以加固登錄的安全。
本文轉(zhuǎn)載自微信公眾號(hào)「架構(gòu)師修行之路 」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系架構(gòu)師修行之路 公眾號(hào)。