01.md5
1. 为什么MD5不再安全
1.1. md5三大安全要求
- 原像攻击
- 第二原像攻击
- 抗碰撞性(主要原因)
相同前缀碰撞
选择前缀碰撞
2. 加盐
对密码进行加盐哈希时,核心思想是把随机生成的盐值和用户密码组合起来,然后再对这个组合后的字符串进行哈希。至于盐值是放在密码的前面(首部) 还是后面(尾部),这取决于具体的哈希算法实现或开发者自己的选择
- 盐值在首部:
盐值 + 密码例如:盐值是ab,密码是123456,那么哈希的输入就是ab123456。 - 盐值在尾部:
密码 + 盐值例如:盐值是ab,密码是123456,那么哈希的输入就是123456ab。
这两种方式在密码哈希的安全本质上没有显著区别,因为哈希函数(尤其是现代密码哈希函数如 bcrypt、scrypt、Argon2)对输入的任何微小改变都极其敏感,无论是把盐值放在前面还是后面,都会生成一个完全不同的哈希值。关键在于,盐值是随机且唯一的,并且在哈希过程中与密码一起作为输入。
2.1. 正确的加盐方式
当用户登录时,系统会取出存储的该用户的唯一盐值,将其与用户输入的密码组合,再次进行哈希,然后比对哈希值。
2.2. 为什么盐值必须是随机且不固定的?
如果盐值是固定的,或者对所有用户都使用同一个盐值,那么它就失去了作为“盐”的大部分安全优势。具体来说:
-
彩虹表攻击会再次变得有效: 如果盐值是固定的(例如,所有用户密码都加上同一个盐值 "mysite_salt"),攻击者就能提前计算出大量的“
常见密码 + mysite_salt”的哈希值,制作成彩虹表。一旦数据库泄露,攻击者就可以直接查表来破解这些密码,就像没有加盐一样。 -
暴力破解效率高: 攻击者只需要计算一次“
猜测密码 + 固定盐值”的哈希,就能用来尝试破解数据库中所有用户的密码。虽然“慢哈希”算法会减慢单次计算的速度,但固定盐值使得攻击者无需为每个用户重新计算不同盐值的哈希,大大提高了破解的效率。