對那些有用戶系統的網站來講,若是存儲用戶的密碼是個問題。 你們都知道不能明文存儲,這樣一旦被脫了褲子,後果很嚴重, 簡單的md5 sha加密也不可取......web
一般在作網站的時候,若是有用戶系統的話,那麼就會涉及到保存用戶信息的功能,算法
最基本的用戶名、密碼是必定要保存的,數據庫
那麼如何保存密碼,是咱們每個web開發者都應該思考的事情。安全
網上時不時的爆出一些網站被拖庫的事情,其中不乏一些咱們眼裏的大網站,函數
使人大跌眼鏡的是,有很多網站還在明文保存密碼。性能
所謂明文,就是把用戶密碼原封不動的保存起來, 這種作法顯而易見是不安全的,一旦你的數據庫被拖庫(拖庫是指數據庫內容被下載),那就將是災難,網站
再加上用戶的習慣性和惰性,不少用戶在多個網站上都會使用一樣的密碼,這也會威脅到用戶在其餘網站上的安全。編碼
還記得csdn600萬,天涯4000萬嗎加密
明文保存的user表spa
id | username | password | createtime |
---|---|---|---|
10001 | test1@hutuseng.com | iloveu | 1393151535 |
10002 | test2@hutuseng.com | hutuseng123 | 1393134647 |
因此咱們不能明文保存,須要將用戶密碼加密,經過算法將明文密碼進行編碼,用咱們的函數y=f(x)表示的話,
x表示原始密碼,y表示加密後的密碼,f 就是咱們須要的加密函數,
加密函數的設計就看本身的了,好比一個簡單的加密算法就是將原始密碼倒排,
舉例來講,你的原始密碼爲 abc123 ,那麼加密以後的密碼就是 321cba,
這樣黑客獲得你的密碼的話,若是直接使用 321cba登陸是沒法登陸的。
簡單加密保存的user表
id | username | password | createtime |
---|---|---|---|
10001 | test1@hutuseng.com | uevoli | 1393151535 |
10002 | test2@hutuseng.com | 321gnesutuh | 1393134647 |
可是,這樣的問題就是,若是黑客知道了你的加密算法f,他很容易就可以經過f和y來反推出x。
因此,咱們須要找到一種不可逆的加密算法,也就是說即便黑客知道了y和f,也是沒法反推出x的。
因而md5 sha1 sha256等哈希算法就出現了,經過這些哈希算法加密後的密碼,很難反推了,這些算法的邏輯太過複雜,能夠找專門的資料看看。
md5加密保存的user表
id | username | password | createtime |
---|---|---|---|
10001 | test1@hutuseng.com | edbd0effac3fcc98e725920a512881e0 | 1393151535 |
10002 | test2@hutuseng.com | 46b54a029136318e9846e1c35f19db06 | 1393134647 |
那麼咱們是否是就能夠把密碼直接用這類算法加密存儲了呢?
固然,最好不要。理由就是,雖然這些算法不可逆,可是他們很容易被暴力破解(暴破)。
暴力破解的原理就是,y=md5(x), 既然沒法反推,那麼就挨個試,
一般黑客們會採用一些密碼字典,挨個把密碼用md5算法算一遍,看看結果跟y是否一致。
因爲如今的電腦性能都很強,並且MD5算法自己也很快,因此若是你的密碼設計不是特別複雜的話,是很容易破解的。
如今,暴力破解這一步都省了,不少人把不少經常使用的密碼的md5啊 sha加密後的密碼都對應起來了,作成了網站,
你只管上網去查就好了,通常簡單的密碼均可以瞬間破解。
好比 www.cmd5.com 之類的網站,你能夠上去試試,edbd0effac3fcc98e725920a512881e0 解密之後是否是就是 iloveu 呢。
因此,爲了防止簡單的密碼被破解,不少網站會要求用戶的註冊密碼設置的儘可能複雜一些,好比最少8位,要包括大小寫字母、數字、特殊符號等,這樣就會大大的增長暴力破解的成本。
那麼按照這個思路,
若是咱們不限制用戶的密碼複雜度,能夠容許用戶使用諸如123456之類的簡單密碼的話,
那麼咱們就須要把用戶的密碼加工一下,變成一個複雜的密碼,
一個很簡單的思路就是,你能夠給用戶密碼增長一個額外的字符串a,好比 88zz%%,
這樣的話,加密算法就變成了, y=md5(x+a), 若是用戶密碼爲123456的話,
那麼加密後的密碼則是 12345688zz%% 這個密碼的md5值,能有效的防止這種經過暴力破解和一些網站碰撞破解。
這裏的這個額外的字符串a,在英文的叫法裏通常叫 salt,也就是鹽的意思,給密碼加點鹽,讓它更安全。
md5加salt加密保存的user表
id | username | password | createtime |
---|---|---|---|
10001 | test1@hutuseng.com | d80dfeadf1181325a22cafba4d5b4782 | 1393151535 |
10002 | test2@hutuseng.com | 010b5eb7da3452f0a2281f185c30e8a2 | 1393134647 |
固然,進一步講, 咱們也可讓每一個用戶的salt也都不同,來進一步的加強安全性。
好比每一個用戶的salt都是他的 createtime 。
還能夠經過多輪md5加密的方式, y=md5(md5(md5(md5(x))))