用户表如何存放用户密码
2019獨角獸企業重金招聘Python工程師標準>>>
先上結論:密碼安全性從低到高
數據庫存密碼原文<數據庫存密文(成本=彩虹表)<數據庫存加固定鹽(固定鹽甚至不能被稱為鹽)的密文(成本=計算出鹽值+制作彩虹表)<數據庫加隨機鹽的密文(成本=用戶數*制作彩虹表)<(隨機鹽+固定鹽+原文)加密(成本=計算固定鹽值+用戶數*制作彩虹表)
我們都知道,密碼存原文,這在現在幾乎是不可能的,用戶密碼一般以密文的形式,存放于表中。如果僅僅是對密碼做一層加密,那么當用戶表數據泄露時,倘若黑客以彩虹表逆向破解密文,加密的密文實際上破解難度并不大(成本=彩虹表,網上現成的),這是因為一些用戶的密碼并不復雜。所以我們需要在加密的過程中,加入鹽值,將密碼原文和鹽值一起加密。而鹽值如果是固定的值,實際上也等于沒加,因為如果密碼原文一樣,鹽值一樣,最后產生的密文值仍然是一樣的,但是這種加固定鹽的方式,可以加大彩虹表破解的難度。因為黑客需要知道鹽是什么,才能通過彩虹表破解(成本=計算出鹽值+制作彩虹表)。但是我們不能把希望寄托于黑客不知道鹽的情況(這樣就違背了密碼學準則),雖然一般來說,數據庫數據被盜取的可能性,大于源碼被破解的可能性(當然了庫能拖走,源碼也能反編譯),甚至黑客可以注冊一個用戶,密碼123456,通過看數據庫里的密文,反向計算出固定鹽值,所以這種方法安全度不高。從密碼學的角度來說,我們希望哪怕兩個用戶的密碼原文是一樣的,但是數據庫里存放的密文是不一樣的。這時,有一種常用的辦法,就是加隨機鹽,鹽值隨機產生,這樣就可以保證用戶密碼原文一致,但密文不一致。那么就出現了一個新的問題,隨機鹽怎么獲取?有人說產生一個隨機數,例如用戶注冊時間,沒錯,那么我們在判斷密碼是否正確的時候,需要知道鹽值是多少,換句話說,如果我們使用隨機鹽,我們就需要保存隨機鹽,那只能保存到數據庫中,可是前文已經提到前提:數據庫數據泄露的情況下。那么所謂的隨機鹽,也就是一個笑話了。當然了,隨機鹽的手段,更能提高黑客破解的難度,哪怕黑客獲取了數據,他也需要針對不同的鹽,制作不同的彩虹表才能反向破解,這大大提高了黑客的成本(成本=用戶數*彩虹表)。還有一種手段,比上述加密更難以破解,就是采取隨機鹽+固定鹽一起,作為鹽值,數據庫表里以某個字段的值作為隨機鹽,比如用戶注冊時間、創建時間、手機號、用戶名等等,源碼里設置一個固定鹽,以此來作為真正的鹽加密。甚至可以為了復雜度,截取隨機鹽的某幾位,將固定鹽MD5作為鹽值等等(成本=計算固定鹽值+用戶數*彩虹表),其實說實話,計算固定鹽值的難度,遠遠低于用戶數*彩虹表的難度,因為一個是沉沒成本,一個是邊際成本。
轉載于:https://my.oschina.net/u/3733854/blog/1919931
總結
以上是生活随笔為你收集整理的用户表如何存放用户密码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018中国互联网企业100强揭晓!阿里
- 下一篇: linux环境安装nagiosgraph