网站该如何存储用户的密码

对那些有用户系统的网站来讲,若是存储用户的密码是个问题。 你们都知道不能明文存储,这样一旦被脱了裤子,后果很严重, 简单的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)))) 

相关文章
相关标签/搜索