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