相同前缀碰撞
选择前缀碰撞
对密码进行加盐哈希时,核心思想是把随机生成的盐值和用户密码组合起来,然后再对这个组合后的字符串进行哈希。至于盐值是放在密码的前面(首部) 还是后面(尾部),这取决于具体的哈希算法实现或开发者自己的选择
盐值 + 密码
例如:盐值是 ab
,密码是 123456
,那么哈希的输入就是 ab123456
。 密码 + 盐值
例如:盐值是 ab
,密码是 123456
,那么哈希的输入就是 123456ab
。当用户登录时,系统会取出存储的该用户的唯一盐值,将其与用户输入的密码组合,再次进行哈希,然后比对哈希值。
如果盐值是固定的,或者对所有用户都使用同一个盐值,那么它就失去了作为“盐”的大部分安全优势。具体来说:
彩虹表攻击会再次变得有效: 如果盐值是固定的(例如,所有用户密码都加上同一个盐值 "mysite_salt"),攻击者就能提前计算出大量的“常见密码 + mysite_salt
”的哈希值,制作成彩虹表。一旦数据库泄露,攻击者就可以直接查表来破解这些密码,就像没有加盐一样。
暴力破解效率高: 攻击者只需要计算一次“猜测密码 + 固定盐值
”的哈希,就能用来尝试破解数据库中所有用户的密码。虽然“慢哈希”算法会减慢单次计算的速度,但固定盐值使得攻击者无需为每个用户重新计算不同盐值的哈希,大大提高了破解的效率。