網站該如何存儲用戶的密碼

對那些有用戶系統的網站來講,若是存儲用戶的密碼是個問題。 你們都知道不能明文存儲,這樣一旦被脫了褲子,後果很嚴重, 簡單的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)))) 

相關文章
相關標籤/搜索