前天,我發(fā)布在博客園上的某知名電商網(wǎng)站的Cookie漏洞引發(fā)園友們的熱議,學(xué)到了很多知識,現(xiàn)在整理一下其中比較激烈的技術(shù)討論。誰對誰錯每個人自己心中都有一把稱,很多時(shí)候都是我無法說服你,你也無法說服我。
論題1:
網(wǎng)友:https是安全的,在傳輸過程對cookie等數(shù)據(jù)進(jìn)行了有效的加密,所以https站下的Cookie也是安全的;
我:https下的cookie在傳輸過是安全的,但在客戶端上是不安全的,使用客戶端的有用戶還有黑客;
我的論據(jù):假設(shè)在某網(wǎng)站A下,我登錄了自己的賬號,打開瀏覽器cookie時(shí)發(fā)現(xiàn)有一條是這樣 user = batsing ,然后我會想我把 user 這個cookie的值改成了別人的用戶名是不是直接就可以登錄了別人的賬號呢?如果服務(wù)端程序是直接根據(jù)這個cookie值就認(rèn)為是這個用戶的話,那么這樣的做法是很可行的。
我的建議:無論有沒有使用SSL,Cookie值都一定要經(jīng)過高強(qiáng)度難破解的加密算法進(jìn)行處理。
論題2:
網(wǎng)友:哈希算法用在加密領(lǐng)域是可以信賴的
我:哈希算法用在加密領(lǐng)域是不可信賴的
我的論據(jù):1、哈希算法產(chǎn)生的密文具有明顯的特征,為黑客破解指明的方向。哈希算法產(chǎn)生的密文全為數(shù)字加純小寫字母(或純大寫),MD5為32位,SHA1為40位,SHA-256為64位,SHA-512為128位。2、哈希算法已經(jīng)有大量的彩虹表和數(shù)據(jù)庫作為破解工具,破解難度大大減少,其安全性值得質(zhì)疑。
我的建議:所有的密文都要使用沒有明顯特征,不易被破解的算法進(jìn)行加密處理,推薦使用AES加密算法。PS:我以前不知道有AES算法的時(shí)候,是混合使用了SHA1、字符串截取和Base64處理的,弄成一眼看上去也不好破解的樣子(同時(shí)包含數(shù)字、大小寫還可能有符號←_←)。
總結(jié):
1、Cookie是可以安全使用的;
2、現(xiàn)在幾乎每個月都會有幾起安全問題被曝光,我們程序員更要提高安全意識;
相關(guān)安全議題:
一、注冊/登錄表單的密碼安全
方案1、使用SSL,使表單信息在傳輸過程中為密文狀態(tài),被截獲時(shí)仍然難以破解利用;
方案2、使用安全控件,比如銀行的網(wǎng)頁和一些大型電商的網(wǎng)頁,在客戶端加密了再傳輸;
方案3、使用JS加密密碼,到服務(wù)端再解密,但由于JS是可見的,加密算法也是可見的,所以JS文件本身也需要進(jìn)行加密壓縮讓其難以閱讀;
二、字符串加密
方案1、很多網(wǎng)站在用的多重哈希加密;(不推薦)
方案2、AES加密;
方案3、現(xiàn)有加密函數(shù)加上自己編的一些字符處理方法組合;
三、Cookie記錄用戶應(yīng)包含和驗(yàn)證的原始信息
1、用戶名√ 用于識別用戶身份的標(biāo)識
2、瀏覽器信息√ 用于阻止部分黑客電腦瀏覽器直接竊用手機(jī)Cookie
3、IP地址ㄨ PC可以用但手機(jī)不能用,手機(jī)IP經(jīng)常會變
4、時(shí)間戳 ? 用途要看具體算法。如果Cookie密文無法還原出原文的時(shí)間戳那么就無法校驗(yàn)時(shí)間戳的有效性;如果可以還原,那么此cookie就可以在后臺判定在規(guī)定時(shí)間內(nèi)有效(注意這里的有效期與平時(shí)說的cookie有效期不一樣,平時(shí)說的有效期是過期會被瀏覽器清走,而這里的是被竊走的cookie在超過一定時(shí)間后就不被后臺程序認(rèn)同)
5、有沒有辦法獲取和使用更獨(dú)立的信息,最好是與設(shè)備綁定的。比如MAC地址,比如手機(jī)的序列碼。
6、cookie一般網(wǎng)站可以使用,提高用戶方便性。但因其有較大被竊取的風(fēng)險(xiǎn),所以與金錢直接相關(guān)的網(wǎng)站/頁面建議不使用cookie。
如何讓別人把cookie復(fù)制走了也無法登錄,這個還沒有想到比較好的解決方案,求指教。