01.md5

1. 为什么MD5不再安全

1.1. md5三大安全要求

  • 原像攻击
  • 第二原像攻击
  • 抗碰撞性(主要原因)

相同前缀碰撞
选择前缀碰撞

2. 加盐

对密码进行加盐哈希时,核心思想是把随机生成的盐值用户密码组合起来,然后再对这个组合后的字符串进行哈希。至于盐值是放在密码的前面(首部) 还是后面(尾部),这取决于具体的哈希算法实现或开发者自己的选择

  • 盐值在首部盐值 + 密码 例如:盐值是 ab,密码是 123456,那么哈希的输入就是 ab123456
  • 盐值在尾部密码 + 盐值 例如:盐值是 ab,密码是 123456,那么哈希的输入就是 123456ab
    这两种方式在密码哈希的安全本质上没有显著区别,因为哈希函数(尤其是现代密码哈希函数如 bcrypt、scrypt、Argon2)对输入的任何微小改变都极其敏感,无论是把盐值放在前面还是后面,都会生成一个完全不同的哈希值。关键在于,盐值是随机且唯一的,并且在哈希过程中与密码一起作为输入

2.1. 正确的加盐方式

  1. 为每个用户生成一个唯一且足够随机的盐值。
  2. 将这个随机盐值与用户的明文密码组合。
  3. 使用慢哈希算法(如 bcrypt, scrypt, Argon2)对组合后的字符串进行哈希。
  4. 将最终的哈希值和对应的盐值一起存储到数据库中(盐值通常以明文形式与哈希值一起存储,因为它本身不是秘密)。

当用户登录时,系统会取出存储的该用户的唯一盐值,将其与用户输入的密码组合,再次进行哈希,然后比对哈希值。

2.2. 为什么盐值必须是随机且不固定的?

如果盐值是固定的,或者对所有用户都使用同一个盐值,那么它就失去了作为“盐”的大部分安全优势。具体来说:

  1. 彩虹表攻击会再次变得有效: 如果盐值是固定的(例如,所有用户密码都加上同一个盐值 "mysite_salt"),攻击者就能提前计算出大量的“常见密码 + mysite_salt”的哈希值,制作成彩虹表。一旦数据库泄露,攻击者就可以直接查表来破解这些密码,就像没有加盐一样。

  2. 暴力破解效率高: 攻击者只需要计算一次“猜测密码 + 固定盐值”的哈希,就能用来尝试破解数据库中所有用户的密码。虽然“慢哈希”算法会减慢单次计算的速度,但固定盐值使得攻击者无需为每个用户重新计算不同盐值的哈希,大大提高了破解的效率。