什么是哈希算法
哈希盐(Salt)
哈希盐是一段随机生成的字符串,用于增强哈希过程的安全性。其核心作用如下:
-
防御彩虹表攻击
彩虹表是预先计算的“明文-哈希值”映射表。通过为每个密码添加唯一盐值,即使两个用户使用相同密码,其哈希结果也会不同,使得彩虹表失效。 -
防止相同密码暴露
不加盐时,相同密码的哈希值相同,攻击者可推断用户密码重复性。加盐后,每个哈希值唯一。
盐值的使用方式
- 生成盐值
- 随机生成足够长的字符串(如16字节以上)。
- 使用安全的随机数生成器(如操作系统的
/dev/urandom)。
- 与密码结合
- 将盐值与原始密码拼接后再哈希:
hash(password + salt)。 - 或使用标准化格式(如
HMAC)。
- 将盐值与原始密码拼接后再哈希:
- 存储盐值
- 将盐值与哈希值一起存储(如数据库中的
salt和password_hash字段)。 - 盐值无需保密,但必须唯一。
- 将盐值与哈希值一起存储(如数据库中的
示例流程(密码存储)
用户注册时:
1. 输入密码: "123456"
2. 生成随机盐值: "a1B2c3D4e5F6g7H8"
3. 拼接密码与盐值: "123456a1B2c3D4e5F6g7H8"
4. 哈希计算: SHA-256 → "9f3d8d...e4a5"
5. 存储结果:
- password_hash = "9f3d8d...e4a5"
- salt = "a1B2c3D4e5F6g7H8"
为什么需要盐值?
假设不添加盐值:
- 用户A和用户B的密码均为"123456",其哈希值相同(如"e10adc...3949")。
- 攻击者只需破解一次哈希,即可知所有使用该密码的账户。
添加盐值后:
- 用户A的盐值为"a1B2c3",哈希结果为"9f3d8d...e4a5"。
- 用户B的盐值为"xY7z8k",哈希结果为"b5c2f1...9d8e"。
- 攻击者需为每个用户单独破解,成本剧增。
现代最佳实践
- 避免使用快速哈希算法(如MD5、SHA-1)
它们易被暴力破解或彩虹表攻击。 - 使用专用密码哈希算法
如bcrypt、scrypt或Argon2,这些算法:- 内置盐值管理。
- 支持动态调整计算成本(迭代次数、内存占用),抵御硬件加速破解。
- 代码示例(伪代码)
// 生成哈希(以bcrypt为例) salt = generate_random_salt() hash = bcrypt(password, salt, cost=12) // 验证密码 is_valid = bcrypt_verify(password, stored_hash)
总结
- 哈希算法:将数据转换为不可逆的指纹,用于验证完整性。
- 哈希盐:随机值,确保相同输入生成不同哈希,提升安全性。
- 关键原则:
- 永远以“哈希+盐值”存储密码,而非明文或单纯哈希。
- 优先使用
bcrypt等抗暴力破解的慢哈希算法。

浙公网安备 33010602011771号