目录

密码加盐和彩虹表攻击

密码明文存储

这种密码存储方式直接将用户密码明文存储在数据库中,一旦数据库被黑客获取,那么所有信息都泄露,有些用户的密码可能在好几个账户上都是相同的,这是一种最不完全的方式

密码hash加密存储

这种方式比上一种略微安全,用户注册时将用户的密码使用指定的hash算法进行加密,然后存储在数据库中,当用户登录的时候将登录的密码使用相同的hash算法进行计算hash值然后与数据库存储的hash值进行比较即可

这种方式可能造成 彩虹表攻击 ,攻击者建立一个 明文->密文 的一个巨大的映射表,如果凑巧你的密码密文被包含在了这个表中,那么黑客就可以知道你的密码明文了

这个数据字典很容易收集,CSDN 泄露的那 600w 个密码,就是很好的原始素材

如果用户密码很复杂那么被包含到彩虹表里面的可能性越小

密码加盐进行hash

这种方式会在用户注册的时候给用户随机上次一个salt值,然后再和用户的密码进行计算hash值

salt 可以是任意字母、数字、或是字母或数字的组合,但必须是随机产生的,每个用户的 Salt 都不一样,用户注册的时候,数据库中存入的不是明文密码,也不是简单的对明文密码进行散列,而是 hash( 明文密码 + Salt),

密码加盐之后还是无法保证100%的安全,如果数据库泄露了,黑客还是可以在他们原来的数据字典中的密码,加上我们泄露数据库中的 Salt,然后散列,然后再匹配,但是由于salt是随机产生的,假如我们的用户数据表中有 30w 条数据,数据字典中有 600w 条数据,那么需要获取30wsalt然后分别对600w的数据字典中的明文密码都加上一个salt计算hash,那最终加盐的彩虹表大小就是30w*600w的条目,这个计算量是巨大的,然后再根据用户数据表的hash值遍历这个彩虹表,这个遍历耗时也是巨大的

并且salt插入的地方也无法知道,可能插入在头、尾、中间任意位置都有可能,这就加大了破解的难度,所以密码加盐还是能够保证安全性的

参考

CSDN600万账户密码泄露事件

为什么要在密码里加点“盐”