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