一文读懂密码散列:原理、攻击与实战防护

·

每当新闻里又爆出“数百万用户密码泄漏”,你都会看到“加密盐”“bcrypt”“Argon2”这些名词被反复提及。到底什么是密码散列?它如何把你的密码变成谁也看不懂的一串字符?为什么加盐能让黑客吃尽苦头?本文用最直白的语言,从原理到攻防,带你一次看懂 密码散列 这一现代互联网安全基石。


密码到底是什么?

在继续深入之前,先确认一个常被忽略的起点:到底什么算“密码”?

即便如此,大多数人对“我的密码是怎样被保存的”依旧一问三不知。事实上,存储方式才真正决定你被盗号的风险有多高。


为什么明文存储密码是一场灾难?

想象你新开了一家会员网站。用户递交“[email protected] / ilovecats2024!” 这对凭证。你有三种选择:

  1. 直接保存原文

    • 一旦被黑客拖库,所有人都能直接看到“ilovecats2024!”
  2. 加密后保存

    • 虽然没人能肉眼看到明文,但有密钥即可解密,仍存在单点故障。
  3. 进行 密码散列 后保存

    • 把原文转成固定长度的随机字符串(哈希值),不可逆、无密钥,泄漏也读不出原密码。

几乎所有现代服务都会选第三点。


深入:什么是密码散列?

密码散列(Hash)= 把任意长度输入 → 通过单向函数 → 输出定长且不可逆的唯一“指纹

核心特点:

“那黑客拿到哈希怎么办呢?” 他们不是“解密”,而是“撞库”——提前把 123456、password、ilovecats 之类高频明文算成哈希,遇到泄漏数据集时快速匹配。

👉 想知道目前最安全的密钥推导算法是什么?点这里一探究竟


比比皆是的攻击手法

攻击名称原理防御重点
生日攻击利用统计学“生日悖论”寻找碰撞选长输出、高复杂度算法
碰撞攻击两个不同密码生成同一哈希值淘汰已被攻破的 MD5/SHA-1
暴力破解穷举所有可能性计算成本高,拖慢即可

👉 立即查看如何给自己的系统加装“减速器”让暴力破解望值兴叹


常见散列算法 2025 现状盘点

  1. MD5

    • 1991 年的老大哥,128 位输出,已可秒破
  2. SHA-1

    • 160 位,Google 早在 2017 年实现碰撞演示,官方退役
  3. SHA-2 & SHA-3

    • 256–512 位长度,无已知有效碰撞,目前主流
  4. bcrypt

    • 默认加盐并动态调成本因子,即使硬件再强也能减速。
  5. Argon2

    • 2015 年密码破解竞赛冠军,抗侧信道 + 内存硬度,推荐配置首选。

避开撞库的杀招:加盐

所谓“盐”(Salt),就是给每个密码额外撒上一把独一无二的随机数据,再一起送进哈希函数。

没有盐会发生什么?

用户明文密码无盐 SHA-256 哈希开头(示例)
Apassword123482c...
Bpassword123482c...

攻击者提前算好常用密码的哈希表,一旦重合就能立刻批量中招。

加盐之后

用户明文32 字节随机盐最终哈希开头
Apassword1230xD4A7...f7c1...
Bpassword1230x9F3C...a3ec...

即使密码相同,哈希结果也不同,预先计算的“彩虹表”瞬间失效。


实战流程图:注册 vs. 登录

用户注册

  1. 用户提交 [email protected] + ilovecats2024!
  2. 系统产生 16 字节随机盐
  3. 盐 + 密码 → Argon2 → 哈希值
  4. 入库:保存 哈希原文绝不落盘

用户登录

  1. 用户再次输入 ilovecats2024!
  2. 系统读出对应 → 同样 Argon2 计算 → 比对哈希
  3. 匹配就通过,不匹配拒绝

FAQ:3 分钟解除你对密码散列的所有困惑

Q1:加过盐就万无一失吗?

不是。盐只能阻止彩虹表;对付暴力破解还得靠算力减速、延长哈希时长,同时选用高安全级别算法(如 Argon2d)。

Q2:把盐和哈希存同一台数据库里,是不是等于白加?

盐本身不需要保密,它的作用是让同一原文变出不同结果。重点是把算法参数(例如 Argon2 的 memory、iterations)调高,拖慢攻击者。

Q3:用户忘记密码怎么办?

系统不会也不该存明文。正确做法是生成一次性重置链接,或发送验证码,让用户自行重设新密码后再走一遍加盐哈希流程。


小结:三件事帮你看懂 99% 的密码安全新闻


核心关键词回顾:密码散列、加盐、bcrypt、Argon2、暴力破解、生日攻击、哈希函數、彩虹表、明文凭据、密钥推导。