如何设计安全的用户登录功能
用戶(hù)登錄功能是Web應(yīng)用系統(tǒng)具備的最基本的功能,關(guān)系到用戶(hù)數(shù)據(jù)和應(yīng)用系統(tǒng)數(shù)據(jù)的安全,設(shè)計(jì)一個(gè)安全的用戶(hù)登錄功能,涉及到以下幾個(gè)方面的內(nèi)容。
(一) 老生常談——口令
1. 口令長(zhǎng)度與復(fù)雜度限制
限制用戶(hù)輸入一些非常容易被破解的口令,比如qwert、asdfg、123456、password之類(lèi)的,參考twitter和 facebook的設(shè)計(jì),為這樣的口令做一個(gè)黑名單,不允許使用黑名單中的口令。同時(shí),還對(duì)用戶(hù)口令的長(zhǎng)度、復(fù)雜度進(jìn)行檢查,要求用戶(hù)設(shè)置足夠長(zhǎng)度,且復(fù) 雜度符合安全策略的口令。
在口令安全的這個(gè)方面,用戶(hù)體驗(yàn)和安全可能是相對(duì)的。限制用戶(hù)輸入某些口令及口令的長(zhǎng)度和復(fù)雜度,在用戶(hù)體驗(yàn)方面可能并不太好。所以,很多成功且 設(shè)計(jì)良好的社交網(wǎng)站(SNS)都提供了UX讓用戶(hù)知道他的口令強(qiáng)度是什么樣的,這樣可以讓用戶(hù)有一個(gè)選擇,目的就是告訴用戶(hù)——要想安全,先把口令設(shè)得好 一點(diǎn)。
2. 不要明文保存用戶(hù)的口令
用戶(hù)都會(huì)用相同的ID相同的口令來(lái)登錄很多網(wǎng)站。所以,如果Web應(yīng)用系統(tǒng)明文保存口令的話(huà),那么,數(shù)據(jù)被不良員工流傳出去那對(duì)用戶(hù)將是災(zāi)難性的。所以,用戶(hù)的口令一定要加密保存,最好是用不可逆的加密,但不要直接使用諸如MD5或是SHA1之類(lèi)加密算法。
3. 不要讓瀏覽器保存口令
瀏覽器記住口令,對(duì)用戶(hù)來(lái)說(shuō)是很方便的事,因?yàn)橛脩?hù)不可能記住那么多的口令,只能借助于某些工具幫助記憶,瀏覽器只是其中的一種。但對(duì)于用戶(hù)數(shù)據(jù)的安全來(lái)說(shuō),有很多方法可以獲取瀏覽器記住的口令。所以,不要讓瀏覽器保存用戶(hù)名和口令。
(二) 用戶(hù)登錄狀態(tài)
HTTP是無(wú)狀態(tài)的協(xié)議,是無(wú)法記錄用戶(hù)訪問(wèn)狀態(tài)的。用戶(hù)的每次請(qǐng)求都是獨(dú)立的無(wú)關(guān)聯(lián)的,一筆是一筆。而我們的Web應(yīng)用系統(tǒng)都是設(shè)計(jì)成多個(gè)頁(yè)面 的,在頁(yè)面跳轉(zhuǎn)過(guò)程中我們需要知道用戶(hù)的狀態(tài),尤其是用戶(hù)登錄的狀態(tài),這樣我們?cè)陧?yè)面跳轉(zhuǎn)后我們才知道是否可以讓用戶(hù)有權(quán)限來(lái)操作一些功能或是查看一些數(shù) 據(jù)。
我們每個(gè)頁(yè)面都需要對(duì)用戶(hù)的身份進(jìn)行認(rèn)證。當(dāng)然,我們不可能讓用戶(hù)在每個(gè)頁(yè)面上輸入用戶(hù)名和口令。為了實(shí)現(xiàn)這一功能,Web應(yīng)用系統(tǒng)會(huì)把用戶(hù)登錄 的信息存放在客戶(hù)端的Cookie里,每個(gè)頁(yè)面都從這個(gè)Cookie里獲得用戶(hù)是否登錄的信息,從而達(dá)到記錄狀態(tài),驗(yàn)證用戶(hù)的目的。但是,Cookie的 使用并不是簡(jiǎn)單的事,下面是使用Cookie的一些原則。
1. 千萬(wàn)不要在Cookie中存放用戶(hù)的密碼
千萬(wàn)不要在Cookie中存放用戶(hù)的密碼,加密的密碼都不行。因?yàn)檫@個(gè)密碼可以被人獲取并嘗試離線窮舉。所以,一定不能把用戶(hù)的密碼保存在Cookie中。
2. 正確的設(shè)計(jì)“記住密碼”
這個(gè)功能簡(jiǎn)直就是一個(gè)安全隱患,通常的設(shè)計(jì)是用戶(hù)戶(hù)勾選了這個(gè)功能,系統(tǒng)會(huì)生成一個(gè)Cookie。Cookie包括用戶(hù)名和一個(gè)固定的散列值,這個(gè)固定的散列值一直使用。這樣,可以在所有的設(shè)備和客戶(hù)上都可以登錄,而且可以有多個(gè)用戶(hù)同時(shí)登錄。更安全一點(diǎn)的做法是:
1) 在Cookie中,保存三個(gè)東西——用戶(hù)名,登錄序列,登錄Token
? 用戶(hù)名:明文存放。
? 登錄序列:一個(gè)被MD5散列過(guò)的隨機(jī)數(shù),僅當(dāng)強(qiáng)制用戶(hù)輸入口令時(shí)更新(如:用戶(hù)修改了口令)。
? 登錄Token:一個(gè)被MD5散列過(guò)的隨機(jī)數(shù),僅一個(gè)登錄Session內(nèi)有效,新的登錄Session會(huì)更新它。
2) 上述三個(gè)要素會(huì)存在服務(wù)器上,服務(wù)器需要驗(yàn)證客戶(hù)端Cookie里的這三個(gè)要素。
登錄Token是單實(shí)例登錄,意思就是一個(gè)用戶(hù)只能有一個(gè)登錄實(shí)例。登錄序列是用來(lái)做盜用行為檢測(cè)的。
如果用戶(hù)的Cookie被盜后,盜用者使用這個(gè)Cookie訪問(wèn)網(wǎng)站時(shí),我們的系統(tǒng)是以為是合法用戶(hù),然后更新“登錄Token”。而真正的用戶(hù) 回來(lái)訪問(wèn)時(shí),系統(tǒng)發(fā)現(xiàn)只有“用戶(hù)名”和“登錄序列”相同,但是“登錄Token” 不對(duì),這樣的話(huà),系統(tǒng)就知道,這個(gè)用戶(hù)可能出現(xiàn)了被盜用的情況。于是,系統(tǒng)可以清除并更改登錄序列 和 登錄Token,這樣就可以令所有的Cookie失效,并要求用戶(hù)輸入口令。并給警告用戶(hù)系統(tǒng)安全。
3. 不要讓Cookie有權(quán)限訪問(wèn)所有的操作
參考新浪微博的XSS攻擊,即使Cookie有權(quán)限訪問(wèn)登錄之后的所有操作。下面的這些功能一定要用戶(hù)輸入口令:
? 修改口令。
? 修改電子郵件。
? 用戶(hù)的隱私信息。
? 涉及金錢(qián)的用戶(hù)消費(fèi)功能。
(三) 找回口令功能
找回口令的功能一定要提供,目前常用的找回口令功能大致有以下幾種:
1) 安全問(wèn)答。
事實(shí)證明,這個(gè)環(huán)節(jié)很煩人,而且用戶(hù)并不能很好的設(shè)置安全問(wèn)答。什么,我的生日啊,我母親的生日,等等。因?yàn)榻裉斓幕ヂ?lián)網(wǎng)和以前不一樣了,因?yàn)镾NS,今天的互聯(lián)比以前更真實(shí)了,在facebook,開(kāi)心,人人網(wǎng),LinkedIn查到很多的真實(shí)的信息。
2) 重置用戶(hù)的密碼。
這有可能讓用戶(hù)的密碼遭到惡意攻擊
3) 安全一點(diǎn)的做法——通過(guò)郵件自行重置。
當(dāng)用戶(hù)申請(qǐng)找回口令功能的時(shí)候,系統(tǒng)生成一個(gè)MD5唯一的隨機(jī)字串(可通過(guò)UID+IP+timestamp+隨機(jī)數(shù)),放在數(shù)據(jù)庫(kù)中,然后設(shè)置 上時(shí)限(比如1小時(shí)內(nèi)),給用戶(hù)發(fā)一個(gè)郵件,這個(gè)連接中包含那個(gè)MD5的字串的鏈接,用戶(hù)通過(guò)點(diǎn)擊那個(gè)鏈接來(lái)自己重新設(shè)置新的口令。
4) 更安全一點(diǎn)的做法——多重認(rèn)證。
比如:通過(guò)手機(jī)+郵件的方式讓用戶(hù)輸入驗(yàn)證碼,還可以使用數(shù)字證書(shū)、動(dòng)態(tài)口令等方式。是否使用多重認(rèn)證,主要取決于Web應(yīng)用系統(tǒng)的重要性程度。
(四) 防御暴力破解
1) 使用驗(yàn)證碼。
驗(yàn)證碼是后臺(tái)隨機(jī)產(chǎn)生的一個(gè)短暫的驗(yàn)證碼,這個(gè)驗(yàn)證碼一般是一個(gè)計(jì)算機(jī)很難識(shí)別的圖片。這樣就可以防止以程序的方式來(lái)嘗試用戶(hù)的口令。
事實(shí)證明,這是最簡(jiǎn)單也最有效的方式。當(dāng)然,總是讓用戶(hù)輸入那些肉眼都看不清的驗(yàn)證碼的用戶(hù)體驗(yàn)不好,所以,可以折中一下。比如Google,當(dāng)發(fā)現(xiàn)一個(gè)IP地址發(fā)出大量的搜索后,其會(huì)要求你輸入驗(yàn)證碼。
2) 用戶(hù)口令失敗次數(shù)
設(shè)置口令失敗的上限,如果失敗過(guò)多,則把帳號(hào)鎖了,需要用戶(hù)以找回口令的方式來(lái)重新激活帳號(hào)。
但是,這個(gè)功能可能會(huì)被惡意人使用,造成用戶(hù)賬戶(hù)不能使用(這是一種變相的拒絕服務(wù)攻擊)。更好的方法是,結(jié)合IP地址做驗(yàn)證,同時(shí)增加嘗試破解 的時(shí)間成本。如,兩次口令嘗試的間隔是5秒鐘。三次以上錯(cuò)誤,帳號(hào)被臨時(shí)鎖上30秒,5次以上帳號(hào)被鎖1分鐘,10次以上錯(cuò)誤帳號(hào)被鎖4小時(shí)等等。如果發(fā) 現(xiàn)來(lái)自同一IP地址的錯(cuò)誤次數(shù)太多,正確的做法是禁止這個(gè)用戶(hù)在這個(gè)IP地址登錄,而不是單純的禁止用戶(hù)登錄。
?
注:轉(zhuǎn)載于http://qq405371160.iteye.com/blog/1743237
轉(zhuǎn)載于:https://www.cnblogs.com/wcyBlog/p/3820353.html
總結(jié)
以上是生活随笔為你收集整理的如何设计安全的用户登录功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 响应式布局---菜单
- 下一篇: Window.document对象