天天看點

資料庫到底應該如何存儲密碼?

最近接手公司一個之前的服務,竟然發現使用者密碼是明文存儲在資料庫中!

說實話還是有點吃驚的,這可不興學 CSDN 呀,至少也得搞個 MD5 存一存吧。

不過 MD5 其實也沒啥用,今天我們就來盤盤密碼這種敏感資訊該如何存儲。

資料庫為什麼不能明文存儲密碼

不僅僅是為了防止系統管理者或者DBA等公司人員獲得使用者的密碼,也是防止被黑客拖庫産生更大的資訊洩露。

如果黑客通過不法手段擷取了服務的資料庫存儲資訊,盜取裡面的内容,進而直接獲得明文密碼,那麼影響就會很大。

資料庫到底應該如何存儲密碼?

因為絕大部分人所有賬戶的密碼都會設定成一樣的,隻要知道一個網站的明文密碼後,基本上等于搞定這個使用者其他網站的所有賬号,也就是撞庫。

是以不能明文存儲密碼,需要加密下。

MD5 不是加密算法

實際上,經常有人會說拿 MD5 加密,這樣說沒問題,但是我們心裡要清楚MD5 壓根就不是加密算法,它其實就是個摘要算法。

加密算法指的是把一段資料加密後,可以解密。

很明顯 MD5 無法解密,隻能暴力窮舉破解,是以它不算是加密算法。

為什麼用 MD5 存儲密碼不好

大部分人的密碼都會設定得比較簡單,比如名字縮寫加個出生日期這種。

而黑客其實會針對常見的一些密碼,生成彩虹表。

彩虹表:是用于加密散列函數逆運算的預先計算好的表,常用于破解加密過的密碼散列(維基百科)

就像下面的表格:

資料庫到底應該如何存儲密碼?

這樣一來隻要準備得足夠充分,彩虹表足夠大,那麼直接對比彩虹表就能反推得出明文密碼,是以直接簡單用 MD5 也是不安全。

給密碼加點鹽

那咋辦麼?

其實彩虹表大部分能找到的隻是常見的密碼。

基于這點,我們雖然不能強迫使用者設定一些非常複雜的密碼(這記憶成本太高)。

但是我們可以手動給使用者的密碼拼接上一些複雜的字元,然後經過哈希函數處理之後落庫。

比如使用者初始密碼是123456,我們可以給他的密碼加點鹽,鹽其實就是一些複雜的字元數字,比如:

資料庫到底應該如何存儲密碼?

這樣即使不法分子盜取到密碼,預先準備的彩虹表(因為密碼變得不常見了)也無用,使得破解的成本變高。

這種鹽叫固态鹽,不需要落庫存儲,一般在代碼或者配置中儲存。一旦被不法分子試出這個的鹽,那麼繼而就能通過這個鹽試出别的密碼。

是以推薦動态鹽,即讓每個賬号下密碼加的鹽都是不一樣的,這樣一來不法分子的破解成本就更高了。

資料庫到底應該如何存儲密碼?

動态鹽需要分别為每個使用者記錄對應密碼加的鹽值,一般是落庫存儲,比如上圖所示在使用者表上加個 salt 字段。

又或者直接跟密碼拼一起中間用特殊符号切分等等,比如下圖用 $ 來分割。(沒錯動态鹽是直接存儲的,也就是說攻擊者可以拿到每個賬号的鹽)。

資料庫到底應該如何存儲密碼?

我還看過一些方案,比如不加字段也不用分隔符,把使用者的建立時間進行處理作為動态鹽,等等。

加鹽這種手段僅僅隻是增加了攻擊者的破解成本,因為攻擊者知道鹽值,進而就能反推出一個值,使得這個md5(值+鹽) = md5(密碼+鹽)。

資料庫到底應該如何存儲密碼?

因為不論這個值是否等于密碼,反正隻要最終 hash 的結果是一樣的,就都能登入,是以攻擊者要推是可以推出來的,隻不過成本會高些。

總而言之,通過摘要算法來存儲密碼,不法分子是可以通過暴力、彩虹表、字典等方式來破解。

如果你僅僅是用 md5 處理密碼存儲,那麼這些破解其實成本也不是很大,咋一說你可能沒啥感覺,我在網上看到一個結論:md5 來存儲 6 位長度的密碼(僅僅包含小寫和數字),隻需要 40 秒,就可以窮舉所有密碼。

bcrypt

是以,為了進一步給黑客們增加破解成本,需要替換 md5 這類 hash 快速的方法,換成 bcrypt 這種算法。

md5 計算隻需要 1 微妙,而 bcrypt 需要 0.3 秒,速度差了 30 萬倍。

1秒=1000000 微秒

是以,如果本來 40 秒就能破解的話,換成 bcrypt 後變成 138 天才能破解!

bcrypt 就是這麼個雜湊演算法,它有個疊代次數,可以使得計算變慢,非常适合這種場景!

不用摘要算法,加密存儲行嗎?

其實還有一種防破解的方式,就是采用加密算法。

比如采用對稱加密 AES,這樣隻要密鑰不洩露,攻擊者拖庫拿到密碼也完全破解不了!

但是反過來想,假設密鑰被洩漏了,那就是白給,比破解上述的hash(密碼+鹽)更輕松,連試試都不需要。

是以加密存儲的話就得看你的密鑰保不保得住了。

最後

大緻方案就這麼幾種。動态鹽其實已經 OK 了,不過算法盡量别用 md5,可以用 sha1、sha256 這些,因為 md5 其實已經被破解了。

這裡的破解不是說通過 md5 可以反向推出明文,而是利用 md5 hash 後的值能快速的找到另一個值使得 md5 的結果一緻。

好了,今天這篇就說這麼多了,更多的可以自行上網查閱。

來源:https://mp.weixin.qq.com/s/6VYdvpwwLQenUqnQOsvFEA

繼續閱讀