天天看點

網站安全之應該如何安全地儲存使用者資料?

這幾天AcFun資料庫洩露的消息一大早就沸沸揚揚地傳開了,所幸從AcFun的公告裡可以看出洩露的使用者密碼均經過「加密」(實際上指哈希),是以我們仍然是安全的。

網站安全之應該如何安全地儲存使用者資料?

網站安全代碼

從洩露出的部分資訊可以看到,在存儲密碼這件事上,AcFun并沒有犯什麼低級錯誤,加之道歉誠懇,很多人表示「選擇原諒」。

合格的後端開發者和運維人員需要考慮每個接口的安全性、每個可被公網通路到的伺服器的安全性,保證不要犯錯。但是我們還需要考慮,如何在已經犯錯的情況下把損失降低到最小。在做資料的存儲方案時,我們需要假設儲存的資料已經被洩露出去了,如使用者密碼這種隐私資料的存儲就是一個重點。

講密碼的存儲方案前,先要記住三條前提:

1.使用者喜歡到處使用一樣的密碼使用者

2.使用者喜歡喜歡使用簡單好記的密碼

3.世界上沒有絕對的安全,但當攻擊成本遠高于收益時,整個系統達到相對安全

明文存儲?

即使僅從道德的角度來說,後端也不應該以明文形式存儲使用者密碼。

2011年CSDN密碼洩露事件和2016年的網易52G事件出現後,比他們資料庫被盜這件事更令人震驚的是,他們洩露的資料庫裡的密碼居然全部都是明文。

明文存儲的方法将安全性全部下放給了運維人員、開發人員和管理人員:

1.從運維層面看,任何作業系統漏洞、基礎工具漏洞的發生,都會導緻密碼洩露

2.從開發層面看,任何代碼邏輯有漏洞、任何依賴庫的漏洞都可能導緻密碼洩露

3.從管理層面看,任何一個有權限讀取資料庫的人,都能看到所有使用者的密碼

由于前提1(大家總是到處使用一樣的密碼),是以明文密碼洩露之後,再使用撞庫攻擊,還能得到其他網站的使用者密碼,對使用者造成更嚴重的危害。比如2014年的12306密碼洩露事件裡,12306并沒有犯錯,隻是黑客收集了很多其他網站的明文賬号密碼,再去12306批量嘗試登陸,就可以得到大量使用者的12306資訊。

是以,後端不應該以任何明文或可以轉換回明文(如可逆的加密)的形式儲存密碼。由于儲存的資訊并不是明文,是以大多數網站的「找回密碼」功能并不能真的告訴你密碼,隻能讓你重新設定一次。如果你發現一個網站的「找回密碼」功能真的找回了你的密碼,那就要當心你密碼的安全性了。

做個哈希?

要儲存密碼的某種可被驗證的形式,又要讓儲存的資料「不可逆」,首先能想到的就是哈希了。

十年前,大多數網站儲存的都是經過一次MD5哈希的密碼。哈希儲存的思路很簡單:使用者注冊時,把他的密碼做一次MD5運算儲存起來;使用者登入時,把他輸入的密碼做一次MD5運算,再驗證是否和資料庫裡儲存的一緻。

在MD5被證明不夠安全以後,大家又開始選擇其他的雜湊演算法如sha256等。但除了雜湊演算法本身的安全性外,這種做法的缺陷很快暴露,就是應付不了彩虹表的攻擊方式。