@
fumichael 数据库加盐加密主要是为了防止彩虹表和哈希字典的。
人们早就知道 'E10ADC3949BA59ABBE56E057F20F883E' = md5('123456')
但如果你采用加盐的方法,你看到 'hellomyzebra,yestheyaresocute:' '3A64C835017B142A97B5ADAECF249673' 又怎么知道密码是多少?
没盐的情况下,你可以直接 select * from users where passhash = 'E10ADC3949BA59ABBE56E057F20F883E' 得到这些人密码是 '123456',甚至给一个哈希字典能够直接 select users.*, hashdict.hashee as password from users left join hashdict on users.passhash=hashdict.hashed 取出所有弱密码,整个耗时不过几秒。
用上彩虹表的话 20 位以下密码也花不了多久。
但加盐首先直接破坏彩虹表,其次弱密码爆破也需要很久,脱裤后有足够久的时间告警所有用户改密码了。
数据库中更标准的是采用 bcrypt 等方式,单密码校验需要 1 秒(可调参使得时间更长),简单 6 位纯数字密码,数据空间达 100 万,就是十几天,还多半不会命中。