- 现代密码学的安全基础是密钥的保密性,而不是像古典密码学那样基于算法的保密性
md5
- md5全称为消息摘要算法版本5 (Message Digest Algorithm 5),是一种hash算法
- md5就是把不论什么长度的文字内容,给精简成128位散列数
- 一个MD5值对应着无穷多的原始值,这是个天然缺陷
- 现在对md5算法的破解,实质就是查彩虹表
- 事先存好很多常用密码的md5值,然后反查,得到对应的原文
- 暴力破解本来不算是可破解的,但是,如果直接利用用户输入的字符进行MD5,就不一样了。用户的可能输入字符组合相对于随机的字符组合来说非常集中,也就是信息熵其实很低:比如,有一些密码组合会被很多人使用,例如123456,password等
- 在加密领域,DES和RSA才是真正的加密,而MD5更多的用在文档校验上,用来生成密钥检测文档是否被篡改
- 常用的哈希函数中,SHA-256、SHA-512 会比 md5 更安全,更难破解
加盐
- 为了保护用户密码,早期人们使用MD5算法把密码加密后保存,通常计算MD5值时会加一个”盐值“(即一个固定的密串),这个盐值可能是共用的(固定盐),也可能是一个用户一个盐值(随机盐)
- 数据库存上salt和hash,每当用户注册,随机生成salt,
hash = md5(password + salt)
- 登录的时候验证
md5(input + salt)
和hash是否相等即可
- 登录的时候验证
- 盐值甚至可以是公开的
- 哈希算法本来就是不可逆的,加盐只是为了防止彩虹表攻击
- 比如我的盐是nizhendehaoshuaia的一串随机字符。这种情况下,彩虹表就没用了
- 因为彩虹表就是提前计算的,那我要算你这个彩虹表,我就得 md5(nizhendehaoshuaia + 注册密码的所有可能"),把这个整个东西算出来先。
- 然而攻击者不可能对每个盐都算一遍彩虹表,这种就根本不划算
- 盐最好每个账号都不一样
- 如果你的盐只有一个,那么他只要算一次,就能反查你所有的账号
- 加盐能保证你不直接受彩虹表的反查攻击,但人家要强行爆破一条密码,还是可以的
- 比如我就要爆破 md5(helloword + nizhendehaoshuaia)这条,那直接暴力穷举即可
- 所以需要那些计算得很慢的哈希函数,那这样别人穷举计算要花很长时间以至于放弃
- 例如
SHA-256
、SHA-512
等hash函数,所以他们比md5更加安全
- 例如
- 为了进一步防止字典攻击,可以在应用服务器加一个pepper
- 加一个pepper就是,在应用服务器上有一串随机字符串,然后哈希前加在密码和盐后面
来源:CSDN
作者:_萤火
链接:https://blog.csdn.net/winter_wu_1998/article/details/103791206