Hashcat 是开源免费的密码恢复与审计工具,也是目前跑得最快的密码破解程序之一。用法很直接:你给它哈希和字典,它把候选词逐个算成哈希去比对,对上了就把原密码打出来。整个过程离线进行,不用连目标服务。下面按本机 Kali 上的实测走一遍(hashcat v7.1.2):安装、三类核心参数、第一次真实破解、读懂结果文件。
只对你自己拥有或获得授权的哈希使用。破解别人的密码哈希属于违法。
一、Hashcat 到底是什么
Hashcat 开源、免费,官网是 https://hashcat.net/hashcat/ 。它能快起来的原因不复杂:算哈希和比对这两步可以并行,交给硬件去堆就行。
上手其实只要抓住三件事,后面所有命令都是这三件事的组合。
- Hash 模式(-m):每种哈希格式对应一个编号。MD5 是 -m 0,SHA1 是 -m 100,Linux /etc/shadow 里常见的 sha512crypt 是 -m 1800,官方支持 300 多种。编号记不住就用 hashcat -hh 查,hashcat –example-hashes 能看到每种格式的示例哈希。
- 攻击模式(-a):决定候选词怎么生成。
- 规则(-r):给字典再加一层变形,比如首字母大写、末尾补个 1、把整个字符串反过来。一个规则文件能让一份字典变出成百上千种候选,Kali 自带一批 *.rule。
攻击模式的对照表在下面。前期真正用得上的其实只有 0、3、6、7 这几个。
| 0 | Straight(字典攻击) | 逐条读字典 | 字典里一句试一句 |
| 1 | Combination | 两本字典两两拼接 | "admin" + "123456" |
| 3 | Brute-force(掩码攻击) | 按字符模板穷举 | ?l?l?d?d?d = 小字母+小字母+3位数字 |
| 6 | Hybrid Wordlist + Mask | 字典 + 掩码 | qwerty + ?d?d = qwerty12 |
| 7 | Hybrid Mask + Wordlist | 掩码 + 字典 | ?d?d + qwerty = 12qwerty |
| 9 | Association | 单词和哈希成对喂入 | 每个用户配一个候选词 |
还有一件事新手最好早点知道:同一台机器上,GPU 版 hashcat 比 CPU 快成百上千倍。虚拟机里通常借不到独显,速度会慢不少,学命令、跑小任务是够用的。真要大字典作业,去装了显卡的真机上跑。
二、安装(以 Kali 为例)
Kali 自带 hashcat,apt 一条命令就装完。安装这一步最省事,麻烦在后面:装完之后有没有可用的计算后端(OpenCL / CUDA / HIP)。
# Kali 检查/安装
hashcat –version
sudo apt update && sudo apt install -y hashcat
非 Debian 系统,或者想用最新版
去官方下载页 https://hashcat.net/hashcat/ 取二进制包。下面以 7.1.2 为例,实际版本号请到下载页确认。
wget https://hashcat.net/files/hashcat-7.1.2.tar.gz
tar -xzf hashcat-7.1.2.tar.gz
cd hashcat-7.1.2 && ./hashcat –version
装完先查后端
hashcat -I
有输出就可以直接开跑。如果报 CL_PLATFORM_NOT_FOUND_KHR 或者 No OpenCL…,看第七节的坑一。
三、常用参数速查
定方向的三件套(几乎每条命令都要给)
| -m NUM | 哈希格式编号(-hh 查全部,–example-hashes 看示例) | -m 0=MD5,-m 1000=NTLM,-m 1800=sha512crypt |
| -a NUM | 攻击模式 | -a 3 掩码攻击 |
| HASH | 哈希:单个直接写,多个写进文件再引用 | hashcat -m 0 hash.txt wordlist.txt |
输入候选词
| wordlist | 字典文件路径(一行一个候选词) | /usr/share/wordlists/rockyou.txt |
| ?l ?u ?d ?s ?a ?b | 掩码字符集:小写/大写/数字/符号/全可打印(94)/0-255 包括不可见 | ?l?l?l?d?d = 5 位"3个字母+2个数字" |
| -r FILE | 规则文件(变形字典) | -r dive.rule |
| –increment | 掩码可变长(?l?d?d 从 3 位试到 max) | -i –increment-min=1 –increment-max=6 |
控制机器与输出
| -w num | 负载档位 1-4(4 最满,本机温度/风扇会猛) | -w 3 |
| -o FILE | 明文结果写入文件 | -o cracked.txt |
| –force | 关掉安全自检硬跑(会绕错误检测,能不用就不用,仅本机调试用) | |
| –show | 只显示已破解的历史(不重跑) | hashcat -m 0 hashes –show |
| –left | 只显示还没破出来的哈希 | |
| -b | 跑基准测试,看本机速度 | hashcat -b -m 0 |
| –remove | 破出一个就从文件里删掉这个哈希 |
四、实战一:跑通第一次字典攻击
先建一个实验目录,把材料放进去。
mkdir -p /tmp/hashlab
# 三个已知明文的 MD5(示例值,你可以自己改)
printf '482c811da5d5b4bc6d497ffa98491e38
d8578edf8458ce06fbc5bb76a58c5ca4
5f4dcc3b5aa765d61d8327deb882cf99
' > /tmp/hashlab/t.md5
# 自制一本小字典
printf 'password
123456
qwerty
letmein
monkey
' > /tmp/hashlab/words.txt
三个哈希对应的明文分别是 password123、qwerty、password。其中 password123 我故意没有放进字典,等会儿看输出你就明白为什么。
然后跑第一次字典攻击。
hashcat -m 0 -a 0 -D 1 –force /tmp/hashlab/t.md5 /tmp/hashlab/words.txt
参数逐个说:
- -m 0:MD5 格式。
- -a 0:字典攻击。
- -D 1:指定用 CPU。-D 2 是 GPU,虚拟机里一般只有 CPU 可用。
- –force:本机 CPU 后端自检报"这是不稳定的组合"时允许继续。只在调试和学习时用,正式跑别带。
- 末尾两个参数:哈希文件、字典文件。
真实输出(节选):
hashcat (v7.1.2) starting
You have enabled –force to bypass dangerous warnings and errors!
Initializing backend runtimes. Please be patient…Initialized backend runtimes
* Device #01: cpu-haswell-AMD Ryzen 7 5800H with Radeon Graphics, 1468/2937 MB (1468 MB allocatable), 4MCU
5f4dcc3b5aa765d61d8327deb882cf99:password
d8578edf8458ce06fbc5bb76a58c5ca4:qwerty
Status………..: Exhausted
Recovered……..: 2/3 (66.67%) Digests (total), 2/3 (66.67%) Digests (new)
Progress………: 5/5 (100.00%)
这一屏怎么读:
| 5f4dcc3b…:password | 破出来的结果行:左边是哈希,右边才是明文。屏幕上只要出现 hash:plain 就是收获 |
| Status………..: Exhausted | 字典被完整烧完了,所有候选都试过 |
| Recovered……..: 2/3 (66.67%) | 3 个目标破出 2 个。第三个 password123 不在字典里,正常 |
| Progress………: 5/5 (100.00%) | 5 条候选,全部试过 |
破出来的两条里面没有 password123,这是新手最该看的一课。它是人群里最常用的密码之一,可我的五行小字典没收它,机器算得再快也碰不到。字典攻击的成败几乎全在字典上,功夫该花在候选质量,而不是多等几分钟。
五、实战二:破解一个"不认识"的 MD5
实战一是知道明文、验证流程。这一节换成真实场景:别人递给你一个文件,里面只有一行。
e10adc3949ba59abbe56e057f20f883e
没有别的前提,目标就是找出明文。
第 1 步:从哈希长相判断格式
| 32 位小写十六进制(0-9a-f) | MD5 | -m 0 |
| 40 位小写十六进制 | SHA1 | -m 100 |
| 64 位小写十六进制 | SHA256 | -m 1400 |
| 带 $/盐段结构(如 $6$salt$…) | 带"盐"的系统哈希(如 sha512crypt) | -m 1800 等 |
这个哈希是 32 位纯十六进制,按经验先当 MD5 试(-m 0)。模式选错不会报错,表现是跑完 0 命中,用这种办法试错成本很低。不放心的话,把长相拿去 hashcat –example-hashes 对一下官方示例。
第 2 步:上大字典
mkdir -p /tmp/hashlab && printf 'e10adc3949ba59abbe56e057f20f883e
' > /tmp/hashlab/unknown.md5
hashcat -m 0 -a 0 -D 1 –force /tmp/hashlab/unknown.md5 /usr/share/wordlists/rockyou.txt
真实输出(节选):
e10adc3949ba59abbe56e057f20f883e:123456
Status………..: Cracked
Recovered……..: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress………: 4096/14344385 (0.03%)
Speed.#01……..: 97591 H/s (0.52ms)
破出来了,明文是 123456,事先没人告诉过我。
这一屏的重点在 Progress:第 4096 个候选词就命中,1400 多万行的字典只走了 0.03%。这不是运气。最弱的密码全挤在大字典的头部,人类用得最多的前一百个弱口令,任何一本大字典都会收录。
第 3 步:字典没结果时用掩码
换一个同样没人告诉我明文的哈希 c33367701511b4f6020ec61ded352059。假设它出现在某个库里,但字典跑完 0 命中。此时从长相再找规律:如果怀疑是纯数字的验证码式密码,就让掩码从短到长逐级穷举。
printf 'c33367701511b4f6020ec61ded352059
' > /tmp/hashlab/m1.md5
hashcat –potfile-path=/tmp/hashlab/my.pot -m 0 -a 3 -D 1 \\
–increment –increment-min=4 –increment-max=6 \\
/tmp/hashlab/m1.md5 '?d?d?d?d?d?d' -o /tmp/hashlab/cracked.txt
- –increment:掩码可变长,从 4 位试到 6 位。阿拉伯数字密码常按位数分档。
- ?d?d?d?d?d?d:6 个数字占位符,–increment 会自动截取前 min 位逐级加长。
- -o cracked.txt:结果落盘。
- –potfile-path:把这次的已破记录存到自己的文件里。potfile 的机制见坑三。
真实输出(三段 Status 就是三个位数分阶段跑):
Status………..: Exhausted
Progress………: 10000/10000 (100.00%) ← 4 位全试完:无果
Status………..: Exhausted
Progress………: 100000/100000 (100.00%) ← 5 位全试完:无果
Status………..: Cracked
c33367701511b4f6020ec61ded352059:654321 ← 6 位命中:明文 654321
Progress………: 1000000/1000000 (100.00%)
把三条路线摆在一起,"破解未知密码"的性价比排序大概是:
大字典(覆盖弱口令) >>> 字典 + 规则(覆盖习惯变体) >> 掩码 + 数字段(覆盖验证码式)
纯数字全 6 位是一百万个候选,CPU 十几秒到几十秒就完。数字、字母、符号混着来 10 位,策略空间就是天文数字,CPU 在物理层面算不动。也正因为这样,密码强度那句话讲的还是长度乘多样性。
第 4 步:把明文留住
cat /tmp/hashlab/cracked.txt # 落盘文件里
hashcat -m 0 /tmp/hashlab/m1.md5 –show # potfile 里也能调出
hashcat -m 0 /tmp/hashlab/m1.md5 –left # 还没破的哈希才会出现
已破记录默认写在 ~/.local/share/hashcat/hashcat.potfile。它是 hashcat 的账本:破出一个记一笔,重跑时自动跳过已破的哈希,不重复烧机器。本文为了演示能复现,用 –potfile-path 把账本单独放到 /tmp;平时用默认路径就行。
第 5 步:不用字典能不能破
能。第 3 步的掩码攻击本来就是零字典:候选词全由 hashcat 按字符模板自己生成,字典一个字节都没碰。这里再补一个字母形态的实测。
先看掩码用到的内置字符集。
| ?d | 0-9 数字 |
| ?l / ?u | 小写 / 大写字母 |
| ?s | 符号 |
| ?a | 全部 94 个可打印字符 |
| -1 ?l?d | 自定义字符集:把小写和数字合成一套新集合,如 ?1?1?1?1?1?1 |
实测目标是随手拿的 MD5 d6ca3fd0c3a3b462ff2b83436dda495e,同样事先没人知道明文,也没喂任何字典。
printf 'd6ca3fd0c3a3b462ff2b83436dda495e
' > /tmp/hashlab/demo_l.md5
hashcat –potfile-path=/tmp/hashlab/pot2 -m 0 -a 3 -D 1 \\
–increment –increment-min=1 –increment-max=4 -w 2 \\
/tmp/hashlab/demo_l.md5 '?l?l?l?l'
真实输出:
Progress………: 26/26 (100.00%) ← 1 位全试完(26 种)
Progress………: 676/676 (100.00%) ← 2 位全试完(676 种)
Progress………: 17576/17576 (100.00%) ← 3 位全试完(17,576 种)
d6ca3fd0c3a3b462ff2b83436dda495e:kali ← 4 位命中:明文 kali
Progress………: 65536/456976 (14.34%)
机器自己算出了 kali,纯算力,零字典。加上第 3 步的 654321,两种字符形态的零字典爆破都实测通过。
可行性分界线(本机 CPU 后端约 9.7 万 H/s,MD5):
| ?d?d?d?d?d?d(6 位数字) | 100 万 | ~10 秒 ✅ |
| ?l?l?l?l(4 位小写) | 46 万 | ~5 秒 ✅ |
| ?l?l?l?l?l?l(6 位小写) | 3 亿 | ~50 分钟 ⚠️ |
| ?l?l?l?l?l?l?l?l(8 位小写) | 2090 亿 | 天级 ⚠️ |
| ?a?a?a?a?d?d?d?d(4 字母 + 4 数字,结构已知) | 78 亿 | ~1 天 ⚠️ |
| 乱猜 10 位(全字符) | 6.6 千万亿 | 物理层面无解 ❌ |
判断纯爆破能不能成,看两件事:密码够短或者形态已知,算力够硬。知道"前 3 位字母、后 4 位数字"这种结构,掩码只扫这个结构的候选;盲目全字符穷举没有意义。GPU 跑 MD5 能到数十亿 H/s,上面那张表每一行除以两三万倍就全绿了。虚拟机 CPU 先把能跑的形态玩透,速度的事留给真机。
三者的关系可以这么记:字典吃人类的偷懒,规则吃变体巧合,掩码吃结构已知加算力。三样都失败,剩下的就是自带熵的长随机密码。它既解释了密码强度为什么重要,也标出了这类工具能走到哪一步。
六、下一层:掩码、规则、已破记录(抄就能用)
# ① 只对没破出来的继续尝试(第二次跑更省时间)
hashcat -m 0 /tmp/hashlab/t.md5 –left -a 0 words.txt
# ② 掩码攻击:猜"6位的、前3字母后3数字"的密码形态
hashcat -m 0 -a 3 /tmp/hashlab/t.md5 ?l?l?l?d?d?d
# ③ 字典 + 规则变形(要 Kali 自带的大字典时先解压 rockyou)
gzip -d /usr/share/wordlists/rockyou.txt.gz
hashcat -m 0 -a 0 /tmp/hashlab/t.md5 /usr/share/wordlists/rockyou.txt -r dive.rule -o cracked.txt
# ④ 探测本机算力上限(决定你敢不敢跑长掩码)
hashcat -b -m 0
# ⑤ 查结果(不重跑,只看已破出来哪些)
hashcat -m 0 /tmp/hashlab/t.md5 –show
七、新手常踩的五个坑
-
坑一:报 No OpenCL, HIP or CUDA compatible platform found。Kali 虚拟机默认没有算力后端,装个 CPU 版后端就能跑,本机实测有效:
sudo apt install -y pocl-opencl-icd
hashcat -I # 之后再查,能看到 Device有独显的物理主机才需要装 NVIDIA CUDA 或者 AMD ROCm。虚拟机里独显直通很麻烦,先用 PoCL 把命令练熟。
-
坑二:屏幕上弹出 [s]tatus [p]ause…,上面还有一句 “The wordlist or mask that you are using is too small”。这不是报错,只是候选太少时的一句提醒,怕你白等。按 s 看状态,按 f 直接收工,或者换本大字典。
-
坑三:第二次跑同一个哈希,“怎么没跑就结束了”。hashcat 把已破的哈希记在 ~/.local/share/hashcat/hashcat.potfile,重跑会自动跳过。想从零再演示一遍,删掉这个文件,或者先 –show 看记录再决定。
-
坑四:把 –force 当日常开瓶器。它会绕过"你这设备可能算错结果"的自检警告。跑真值之前先把后端环境调好,别让 –force 把错误结果静默吞掉。
-
坑五:卡在 Status: Running… 0 H/s。多半是掩码太长(CPU 跑 8 位全字符就是天文数字)、格式选错(把 sha1 喂给了 -m 0),或者字典还是 gzip 没解压(先 gzip -d)。先 hashcat -b 摸一摸本机上限,再决定掩码长度。
八、收尾
Hashcat 的定位可以这么说:知道锁孔形状(哈希格式)之后,高速试钥匙的机器。你要定的只有三件事,-m 是哪种哈希,-a 怎么生成候选,喂什么哈希和字典。剩下的时间看输出里的 hash:plain 行。
第一次跑通的关键,是读懂实战一那屏输出。字典里没它,等于没钥匙,这句比任何参数都实在。功夫花在候选质量上,别花在等待时间上。
最后再说一遍合规:Hashcat 只能用在你自己拥有、或者拿到明确授权的哈希和系统上。审计自己的密码强度是正途,动别人的系统就是违法。
网硕互联帮助中心



评论前必须登录!
注册