. 什么是盐
有些童鞋可能对这个名词还有些陌生,这个盐当然不是我们平时吃的盐,也不是化学中的盐,而是一段字符串,用于和明文串接在一起然后哈希得到密文。比如我的密码是sunny (这当然不是真的密码...),然后我的盐为abc,那么拼接在一起就可以是sunnyabc,然后以此哈希后存入数据库。当我再次登录的时候,再将我的密码加盐后哈希与数据库存储的密码比对。
为什么要加盐
我们从暴力破解说起,面对一个md5加密的密文,你会考虑这么破解。可以跑密码字典,也可以用查表法,包括反向查表,彩虹表之类的。其实本质都是暴力破解,只不过现场跑密码字典很慢,而用查表的话,特别是表的数据已经累计到一定程度之后,很可能一查一个准,就有点类似我们的缓存。所以我们需要加盐,即使通过一定的手段得到了明文,在不知道盐的情况下,也会增加一定的破解负担。
如何加盐
如何加盐其实主要指的是如何选择盐,通常盐的长度需要较长,短盐的效果可能不是那么好。其实通常各种资料里会建议用一个随机生成的盐。这样能确保每个密文的盐尽量不同,增加破解难度。使用随机生成的盐也是有一定的弊端,较大的弊端就是,这个盐也必须存储,所以也是有机会获取的。所以,我在这里就提出一种思路,至于好不好大家可以讨论一下。首先,考虑生成的盐是每个用户有所区别的。这一点很重要,作用类似于随机生成的盐。然后,考虑这个盐不能进行存储,而是可以用现有的用户信息进行生成。这样其实已经很明显了,可以用某种算法利用当前用户的信息(必须是固定不会修改的信息),比如用户id、用户注册时间等。这个算法也可以是哈希加密算法,比如将用户的几个信息进行一定的排序处理之后利用哈希生成盐。