2014年1月8日 星期三

儲存 Password 安全性

Password

        Password 是大部份系統用來認證或是識別使用者最常見的方式,特別是網站系統最需要這種機制,來提供一般使用者進行登入取得瀏覽的權限或是使用網站的服務。網站系統最常見的保護方式就是在網頁上提供隨機的圖形驗證碼 CAPTCHA ,來避免有心人透過工具作自動化的方式暴力破解使用者的密碼。然而,一個系統的安全性取決於系統環節中最弱的一環。因此,擋得住網站系統前端,卻擋不住系統後端資料庫時,一旦被攻破資料庫時,若使用者的密碼沒有被保護而以明文(Plain-Text)的方式儲存時,這樣的系統可以說是完全沒有任何安全性。因此,比較有良心的開發人員,會透過其他方式來保護使用的密碼。

早期 Password 的保護方式

        早期對於Password的保護方式是透過 password + salt 方式,把這兩個值當作參數進行 Hash 運算(MD5, SHA1,SHA256...etc),每一個 password 都需要搭配一個隨機產生的 salt,並且透過 One-way 的 Hash 函數算出一個亂數值的字串來存放。所謂的 One-way 的 Hash 函數是指無法透過知道 salt 和產生後的亂數值算出原本的 password。對於這方面的技術有興趣的可以參考 Slated Password Hashing 的文章。在過去硬體的運算能力不夠快的情況下,這樣的保護機制其實是足夠的。然而運算能力越來越強的情況下,這種保護機制隨即崩盤,請參考2012年Speed Hashing 的文章,裡面主要是提到GPU運算能力可以很容易的破解 SHA1+Salt 所保護的密碼。

建議的 Password 的保護方式

        目前(2013)在密碼學領域建議用來保護密碼的 key derivation function 我目前知道的有以下這幾種: scrypt, bcrypt, PBKDF2. 之前的專案曾經用Python版本的 bcrypt 來做 Password Protection的處理.

Reference

Using scrypt in Python and PostgreSQL - http://kevinryan.me/using-scrypt-in-python-and-postgresql/


沒有留言:

張貼留言

歡迎留言討論與指教