密码学中salt的意义

我们知道当我们的用户登录的时候,如果任由用户的account和password不加修饰直接裸奔在互联网环境中,是不负责任的,会暴露用户的信息,损失用户的钱财等。

一般我们使用摘要MD5算法对用户的密码进行一次hash,把hash值保存在数据库中。当用户使用他的账号密码登录的时候,我们对用户的密码进行MD5计算出hash值,然后拿计算出的值和数据库中保存的hash值比对,相等则认为是正确的账号密码,允许登录。

通过上边的流程我们可以想象的到,MD5摘要算法对于相同的密码总是得出同样的hash值,不然也就没有比对相等的说法了。但这样就有一个问题,因为对于相同的密码总是得出同样的hash值,那就可以对常见的密码的hash值进行保存,做成一个大字典。如果用户的密码生成的hash值被泄漏了,一些别有用心的人就可以穷举这个大字典:如果某个密码生成的hash值和泄漏出去的值一致,也就获取到了该用户的密码,那也就不安全了。

况且MD5算法使用至今,已经保存了太多的hash值,安全性可想而知。

这时候我们可以使用salt来进一步保护用户的密码。

salt是一个随机字符串,我们可以使用MD5(pass+salt)来计算hash值,然后把hash值和salt按某种特殊的拼接方式存在数据库中。当用户登录的时候,我们把这串特殊拼接的字符串还原回hash和salt,同样使用MD5(pass+salt)计算hash值,和还原的hash值进行比对,比对一致则认为是正确的账号密码,允许登录。

这时候我们发现,就算我们保存的这串经过特殊拼接的字符串即使被泄漏出去也没关系。首先,别人不知道我们是怎么拼接的这串东西,哪里是hash,哪里是salt?其次,就算被他蒙对了,他也不知道我们的算法,我们是怎么使用salt的,是MD5(pass+salt)还是MD5(salt+pass)又或者是MD5(MD5(pass+salt)+MD5(salt+pass))?大大增加了破解用户密码的难度。

我们的salt发挥了作用,我们的用户也可以安心了。

你可能感兴趣的:(密码学中salt的意义)