密码破解你的密码在黑客眼里能撑多久
原创
围巢安全笔记
围巢安全笔记
围巢安全笔记
2026年10月22日 09:00
北京
去阅读
渗透测试实战 · 第 19 篇
前几天帮一个朋友做安全评估,拿到了他们系统的用户密码哈希文件。我用Hashcat跑了一下,10分钟就破解出了80%的密码——不是因为我技术多牛,而是因为用户的密码太弱了。123456、password、admin123、姓名+生日,这些密码在现代硬件面前,几秒钟就能破解。这篇把密码破解的原理讲透,让你知道你的密码到底安不安全。
本文仅限密码安全教学,请勿用于破解他人账号。约 2400 字,附 2 个实用干货。
01|密码是怎么存储的:从明文到哈希
在讲密码破解之前,先搞清楚密码是怎么存储的。早期的网站是把密码明文存在数据库里的——你注册的时候输入123456,数据库里就存123456。这显然不安全,数据库一旦被拖库,所有用户的密码就全泄露了。
后来大家开始用哈希(Hash)来存储密码。哈希函数是一个单向函数——你把密码输进去,它输出一串固定长度的乱码。比如123456用MD5哈希之后是e10adc3949ba59abbe56e057f20f883e。这个过程是不可逆的,你不能从这串乱码反推出原始密码。网站验证密码的时候,把你输入的密码也哈希一下,然后和数据库里的哈希值对比,如果一样就说明密码正确。
听起来很安全对吧?但是哈希有一个特点——同一个密码,哈希出来的结果永远是一样的。这就意味着,如果两个人都用123456做密码,他们的哈希值是一样的。而且,攻击者可以预先计算大量常见密码的哈希值,做成一个\"彩虹表\",拿到哈希值之后直接查表就能找到对应的密码。
字典攻击原理:用大量常见密码逐个尝试,直到找到匹配的哈希值
为了对抗彩虹表,大家又发明了\"加盐\"(Salt)——在哈希密码的时候,给每个用户生成一个随机的字符串(盐),把盐和密码拼在一起再哈希。这样即使两个人用了相同的密码,因为盐不一样,哈希结果也不一样。彩虹表就失效了,因为攻击者不可能为每一个可能的盐都预先计算彩虹表。
但是加盐也不是万能的。如果攻击者拿到了数据库(里面有哈希值和盐),他还是可以用字典攻击——把字典里的每个密码和盐拼在一起哈希,然后和目标哈希值对比。区别只是不能用预先计算好的彩虹表,需要现场计算而已。而现代GPU的计算能力非常强,现场计算的速度也很快。
02|密码破解的四种方式
- 字典攻击(Dictionary Attack)
最常用的破解方式。准备一个包含大量常见密码的字典文件,然后逐个尝试,把每个密码哈希之后和目标哈希值对比。如果目标密码在字典里,就能破解成功。
字典的质量决定了破解的成功率。常用的字典有rockyou(来自真实泄露事件的1400万个密码)、SecLists(安全测试常用的各种字典集合)、中文姓名+生日组合字典等。很多人喜欢用姓名拼音+生日、手机号、公司名+年份这类密码,针对性地生成字典,破解率非常高。
- 暴力破解(Brute Force)
穷举所有可能的密码组合。比如6位数字密码,从000000试到999999,总共100万种可能,在现代GPU上几秒钟就能跑完。但是如果密码长度增加、字符集扩大,组合数会指数级增长。
比如8位混合密码(大小写字母+数字+特殊符号,共95种字符),组合数是95^8 ≈ 6.6×10^15,用一块RTX 4090跑MD5哈希(每秒约2000亿次),需要约380天才能跑完。所以足够长、足够复杂的密码,暴力破解是不现实的。
- 彩虹表攻击(Rainbow Table)
预先计算大量密码的哈希值,存储在一个表里,拿到目标哈希之后直接查表。优点是破解速度极快(查表就行,不需要现场计算),缺点是需要大量存储空间,而且只能对付没有加盐的哈希。现在大部分网站都加盐了,彩虹表的用武之地越来越小。
- 掩码攻击(Mask Attack)
字典攻击和暴力破解的结合。如果你知道密码的一些规律(比如前三位是字母、后三位是数字、中间是特殊符号),可以用掩码来指定每一位的字符集,只尝试符合规律的组合。这样能大大缩小搜索范围,提高破解效率。
比如你知道密码是\"姓名拼音+3位数字\",姓名拼音假设是5个字母,那掩码就是?l?l?l?l?l?d?d?d,总共26^5 × 10^3 ≈ 1.18亿种组合,在GPU上几秒钟就能跑完。
03|不同哈希算法的破解难度天差地别
不是所有哈希算法都一样好破解。算法设计的目的不同,破解难度也天差地别。下面是常见哈希算法在RTX 4090上的破解速度对比:
# 常见哈希算法在RTX 4090上的破解速度(Hashcat基准测试)
MD5: ~2000亿次/秒 (最快,8位数字密码瞬间破解)
SHA1: ~800亿次/秒
NTLM: ~1200亿次/秒 (Windows密码哈希,非常快)
SHA256: ~120亿次/秒
SHA512: ~30亿次/秒
bcrypt: ~10万次/秒 (慢了100万倍!)
scrypt: ~5万次/秒
Argon2: ~1万次/秒 (目前最慢、最安全的密码哈希算法)
# 为什么差距这么大?
# MD5/SHA系列是为\"快\"设计的——它们是通用哈希函数,
# 用于文件校验、数字签名等场景,需要快速计算。
# 但是快也意味着攻击者能快速穷举。
# bcrypt/scrypt/Argon2是专门为密码存储设计的\"慢哈希\"——
# 它们故意把计算过程设计得很慢、很耗内存,
# 让攻击者即使有GPU也跑不快。
# bcrypt有一个\"工作因子\"参数,可以调整计算速度,
# 硬件越来越快,你就把工作因子调大,保持破解速度不变。
# 结论:
# 如果网站用MD5或SHA1存密码,8位以下的密码基本等于明文。
# 如果网站用bcrypt或Argon2存密码,8位复杂密码很难破解。
# 所以选对哈希算法,比要求用户设复杂密码更重要。
Hashcat是目前最快的密码破解工具,支持GPU加速和300多种哈希算法
干货你的密码能撑多久?密码强度自测表
用一块RTX 4090跑MD5哈希(最常见的弱哈希),不同密码的破解时间:
# 纯数字密码
6位数字(000000-999999): 瞬间(0.000005秒)
8位数字: 瞬间(0.0005秒)
10位数字: 0.05秒
12位数字: 5秒
# 纯小写字母密码
6位字母: 0.0002秒
8位字母: 0.4秒
10位字母: 3分钟
# 大小写字母+数字(62种字符)
6位: 0.003秒
8位: 2小时
10位: 5年
12位: 20万年
# 大小写字母+数字+特殊符号(95种字符)
8位: 380天
10位: 3000年
12位: 2700万年
# 但是!以上都是暴力破解的时间。
# 如果用字典攻击,情况完全不同:
# - 123456、password、admin等常见密码:瞬间
# - 姓名拼音+生日:几分钟到几小时
# - 普通英文单词+数字:几小时到几天
# - 随机生成的12位复杂密码:基本不可能破解
# 安全建议:
# 1. 密码长度至少12位,越长越好
# 2. 用大小写字母+数字+特殊符号的混合
# 3. 不要用姓名、生日、手机号、常见单词
# 4. 每个网站用不同的密码,不要复用
# 5. 用密码管理器(如Bitwarden、1Password)生成和管理随机密码
# 6. 开启两步验证(2FA),即使密码泄露也有第二道防线
密码安全的核心是\"长度+随机性\"。一个16位的随机密码,比一个8位的复杂密码安全得多。
04|在线密码破解 vs 离线密码破解
密码破解分为两种场景:在线破解和离线破解,两者的难度和方法完全不同。
在线破解
就是直接在登录页面尝试用户名和密码组合。这种方式的限制很多——网站通常有登录失败次数限制、验证码、IP封禁等防护措施,你不可能每秒试几万次密码。在线破解的速度通常是每秒几次到几十次,而且很容易被发现。
在线破解的关键不是速度,而是\"精准\"——用尽可能少的尝试次数命中正确密码。所以要针对目标生成高质量的字典,比如用目标的姓名、生日、公司名、常用密码等信息生成定制化字典,而不是用通用字典瞎试。
离线破解
就是拿到了密码哈希文件之后,在本地用GPU高速破解。这种方式没有次数限制,也不会被发现,唯一的限制就是你的硬件算力。离线破解的速度可以达到每秒几百亿次,弱密码在它面前不堪一击。
离线破解的常用工具是Hashcat(支持GPU加速,支持300多种哈希算法)和John the Ripper(老牌密码破解工具,支持很多特殊格式)。这两个工具都是开源免费的,Kali Linux里自带。
干货开发者必看:密码存储的正确姿势
如果你是开发者,或者你在做系统安全加固,密码存储一定要按照下面的标准来:
# 绝对不要做的事:
# 1. 不要明文存储密码
# 2. 不要用MD5、SHA1、SHA256等快速哈希算法存密码
# 3. 不要用不加盐的哈希
# 4. 不要用固定的盐(所有用户用同一个盐)
# 5. 不要自己发明密码哈希算法(用成熟的标准算法)
# 应该做的事:
# 1. 用专门的密码哈希算法:Argon2(首选)、bcrypt、scrypt
# 2. 每个用户用独立的随机盐(至少16字节)
# 3. 调整算法参数,让单次哈希计算时间在100ms以上
# (这样攻击者每秒最多试10次,暴力破解基本不可能)
# 4. 密码传输过程中用HTTPS加密,不要明文传输
# 5. 登录失败次数限制+验证码+IP封禁,防止在线暴力破解
# 6. 支持两步验证(2FA),给用户多一层保护
# 7. 定期提醒用户修改密码,特别是发生数据泄露之后
# 8. 不要在日志里记录密码(包括登录失败的日志)
# 各语言推荐的密码哈希库:
# Python: bcrypt、argon2-cffi、passlib
# Java: BCryptPasswordEncoder(Spring Security自带)、Argon2
# PHP: password_hash()(PHP 5.5+自带,默认用bcrypt)
# Node.js: bcrypt、argon2
# Go: golang.org/x/crypto/bcrypt
# 记住:
# 用户的密码安全是你的责任。
# 如果你的数据库被拖库了,
# 用了弱哈希算法导致大量密码被破解,
# 那就是你的安全事故,不是用户的密码太弱。
密码安全是系统安全的基础。选对哈希算法、做好加盐、限制登录尝试,这三件事做好了,密码安全就有了基本保障。
密码是网络安全的第一道防线,也是最容易被攻破的防线。很多安全事件的起因,就是一个弱密码——攻击者用123456登录了管理员账号,然后整个系统就沦陷了。作为用户,你能做的就是设一个足够长、足够随机的密码,并且每个网站用不同的密码。作为开发者,你能做的就是用正确的方式存储密码,给用户的密码安全兜底。
最后再次提醒:本文所有内容仅限密码安全教学,请勿用于破解他人账号。未经授权破解他人账号属于违法行为,将承担法律责任。
下一篇我们聊Redis未授权访问——一个配置不当就能让你丢服务器的经典漏洞。我们下篇见。
围巢安全笔记
不生产焦虑,只分享踩过的坑和挖过的洞
你的密码用了多少年没换了?评论区聊聊 👇
有想聊的话题,后台留言告诉我
往期回顾
- Nmap:用了三年才搞懂的端口扫描神器
- 渗透测试思路:怎么找未授权接口和隐藏参数
- AI安全的六大漏洞:从训练数据到供应链
- 大模型越狱:那些让AI\"不听话\"的基础手法
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论