首先,我们看看什么是盐:http://zh.wikipedia.org/zh/%E7%9B%90_%28%E5%AF%86%E7%A0%81%E5%AD%A6%29
通常情况下,当字段经过散列处理(如MD5),会生成一段散列值,而散列后的值通常是无法通过特定算法得到原始字段的。可是某些情况,比方一个大型的彩虹表,通过在表中搜索该MD5值,非常有可能在极短的时间内找到该散列值相应的真实字段内容。
加盐后的散列值,能够极大的减少因为用户数据被盗而带来的password泄漏风险,即使通过彩虹表寻找到了散列后的数值所相应的原始内容,可是因为经过了加盐,插入的字符串扰乱了真正的password,使得获得真实password的概率大大减少。
可是非常多人没意识到的是静态盐仍然不够安全。因为静态盐要面临两种攻击:
1,基于特定的静态盐,能够生成特定的彩虹表.
2,对静态盐处理过的散列password,能够按出现频率进行排序,最常出现的散列password,相应的明文password必定还是那些111111、123456之类的。
因此,对于重要的账号password,我们须要採用动态盐来对password进行混淆。一个经常使用做法就是把账号名进行MD5之后,作为动态盐。则上述两种攻击将失效。
比方,username是wsq,相应的md5是4572381974328f9c作为动态盐,password是123456,加上动态盐之后为4572381974328f9c 123456 ,再MD5是d16e970d6e5b95b9。则终于的计算结果是无法推測的(unguessable)