別辜負(fù)信任 如何讓密碼存儲足夠安全
作為軟件開發(fā)者,其中最重要的一個責(zé)任就是保護(hù)用戶的個人信息,如果用戶沒有相關(guān)技術(shù)知識,他們在使用我們服務(wù)的時候,別無選擇只能信任我們。可惜的是,當(dāng)我們調(diào)查關(guān)于密碼處理的時候,我們發(fā)現(xiàn)有各種不同的處理方式,而這些方式有很多都不安全。雖然不可能構(gòu)建一個完全安全的系統(tǒng),但我們可以通過一些簡單的步驟讓我們的密碼存儲足夠安全。
不應(yīng)該:
首先讓我們看看當(dāng)我們構(gòu)建一個需要用戶認(rèn)證的系統(tǒng)的時候不應(yīng)該怎么做。
●在不得已的時候不要自己存儲用戶的認(rèn)證信息。我們可以考慮使用OAuth的提供者例如Google、Facebook。如果構(gòu)建企業(yè)內(nèi)部的應(yīng)用,可以考慮使用已有的內(nèi)部認(rèn)證服務(wù),例如企業(yè)LDAP或者Kerberos服務(wù)。無論是面向公眾的還是面向內(nèi)部的應(yīng)用程序,用戶會喜歡這個應(yīng)用,因為他不需要多記住一個ID和密碼,同時也少了受黑客攻擊的危險。
●如果你必須存儲認(rèn)證信息,不要存儲明文密碼。這句話就不解釋了。
●不要使用可逆的加密方式,除非你在某種狀況下真的需要查出來明文密碼。因為在進(jìn)行用戶身份驗證的時候并不需要明文密碼去比對。
●不要使用過時的哈希算法,例如md5,在現(xiàn)在這個社會,有人可以通過構(gòu)建一個超大的md5庫來反向的查詢出明文。換句話說md5哈希基本上沒什么用,你要是不相信可以拿這個密文(569a70c2ccd0ac41c9d1637afe8cd932)去md5hacker上看看,幾秒內(nèi)就可以查出明文了。
應(yīng)該:
說完了不應(yīng)該做的,就說說應(yīng)該做的:
●選擇一個單向(不可逆)的加密算法。就像我上面說的一樣,僅僅存儲加密后的用戶密碼,用戶每次認(rèn)證就使用相同的算法加密后比對就可以了。
●選擇一個你的應(yīng)用可以承受的最慢的加密算法。任何現(xiàn)代的加密算法都支持在加密的時候接受參數(shù)從而使加密時間延長,而解密也自然就更難。(例如PBKDF2,可以通過制定迭代的次數(shù)來實現(xiàn))。為什么慢了好呢?因為用戶幾乎不會關(guān)心他為了認(rèn)證自己的賬戶額外的花銷了100ms。但是黑客就不同了,當(dāng)他進(jìn)行上10億次的嘗試計算的時候,就有他喝一壺的了。
●選擇一個流行的算法。美國國家標(biāo)準(zhǔn)與技術(shù)研究院推薦使用PBKDF2加密密碼。
























