Salting 加盐

在哈希之前往原始数据里加一段随机字符串(salt),用来加强 hash 函数。每个用户独立 salt,即使两个人密码都是 password123,存进数据库的 hash 也完全不同。

不加 Salt vs 加 Salt

不加 salt:

hash("password123") = 482c811da5d5b4bc6d497ffa98491e38

全网共享同一个值 —— 攻击者一查 rainbow table 秒破。

加 salt:

hash("password123" + "a3f7k9q2") = b8c..(完全不同)
hash("password123" + "x9m4p1z8") = 7e2..(又不同)

每个用户独立 salt,rainbow table 失效。

Salt 怎么存

  • Salt 不需要保密,跟 hash 一起存数据库就行
  • 关键是每个用户独立足够长足够随机(至少 16 字节)
  • 现代密码 hash 算法(bcrypt、scrypt、argon2)内置 salt 机制,自动处理

Salt + Pepper

更严格的方案再加一个 pepper —— 存在应用配置里(不在数据库里)的全局密钥。即便数据库泄露,没拿到 pepper 也破不了。

为啥这是底线

任何明文存密码、或不加 salt 的 hash,都属于生产事故级错误。2012 LinkedIn 泄露 6.5 亿密码 hash(SHA1 无 salt)就是典型例子,几小时内大量被破。

直接对应 Rainbow Table 的防御。