前言
通常情况下,我们加密密码或者其他字符串,都会采用md5的方式进行加密,但是我们常常看到有很多网站采用了md5+盐值的加密,这到底有什么好处呢?普通的md5加密又有哪些缺点呢?本文我们就来聊聊盐值加密的作用以及实现方法。
一、普通加密方式的局限
通常情况下,我们会把密码直接进行md5加密,加密后进行存储,然后每次登录校验都是拿md5后的字符串进行校验,这样相对于明文存储是大大降低了风险性。
但是如果黑客可以对通过获得这个密码散列值,然后通过查散列值字典,其实也可以得到用户的密码,所以这种方式也是安全性不够高的。
二、盐值加密的原理和作用
加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是当用户注册时,由系统自动往这个密码里加一段字符串,然后再散列。注册完成后,系统会把加密后的字符串以及刚才加的字符串都存入数据库。而当用户登录时,系统为用户提供的密码和用户名查出数据库存储的盐值字符串,然后散列,再比较散列值,已确定密码是否正确。
这里加的字符串被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。这样,即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,他们的散列值也是不同的。那么黑客则难以通过自己的密码和自己生成的散列值来找具有特定密码的用户。
三、md5+盐值加密的实现
一个简单的加盐MD5算法可以用php实现如下:
function do_hash($psw)
{
$salt = 'aFXBxYmkClsw46y7b8C5qN56zs'; //定义一个salt值,最好够长,或者随机
return md5($psw,$salt); //返回加salt后的散列
}
我们也可以在md5之后再加上盐值进行再一次md5,或者对其中一段进行截取形成复杂一点的加密算法,如下:
function passCrypt($psw)
{
$psw=md5($psw);
$salt=substr($psw,-1,3);
$psw=crypt($psw,$salt);
return $psw;
}
四、含加盐值MD5算法的应用
目前多家的网站程序公司都已经加入了该算法,如常见的VBB论坛、discuz论坛等都采用了,甚至著名的Linux开源操作系统早已经加入了这种加密模式。可得而知,这种算法势必会在未来应用于更多的范围。
参考文章:
1、https://blog.csdn.net/blade2001/article/details/6341078
2、https://segmentfault.com/a/1190000003024932