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