简介:本资源为基于Python的密码破解分析系统源码包,面向具备一定Python与深度学习基础、关注密码安全与口令猜测方向的学习者和研究人员。项目围绕密码破解数据展开,涵盖数据清洗、分割与标准化等预处理流程,并利用LSTM与Seq2Seq模型进行训练,通过贪婪搜索和集束搜索评估命中率、召回率等指标,最后借助matplotlib完成结果可视化,帮助读者理解从数据到模型评估的完整分析链路。压缩包共74个文件,以60个py源码文件为核心,辅以6个sh脚本、3个svg架构图、2个txt说明、2个json配置及1个md文档,整体约711KB,结构清晰便于按模块查阅。目前已有62人学习下载,适合作为密码安全分析、序列建模与模型评估的实践参考,也可用于二次开发与实验复现。
1. 从一份 Python 密码破解分析源码说起:它到底能跑出什么结果
很多人第一次看到「密码破解分析系统」这几个字,脑子里浮现的是暴力跑字典的脚本。但这套基于 Python 的源码包走的是另一条路:它不直接硬碰密码,而是用 LSTM 和 Seq2Seq 去学习真实泄露口令的编辑规律,再拿模型去猜。换句话说,它研究的是「人怎么改密码」,而不是「机器怎么撞密码」。包里同时给了 Pass2Path、PITG 两条技术路线的训练与评估脚本,还有一整套可视化绘图代码,能直接产出命中率曲线、编辑距离分布图。适合做安全研究、口令强度评估、课程设计,或者想拿一份能跑通的深度学习口令分析工程练手的人。下面我按「能干什么 → 怎么装怎么跑 → 坑在哪 → 怎么验证」的顺序拆一遍。
2. 先看清工程结构:src 目录里到底藏了哪几条技术线
2.1 baseline、targuess、das 三个目录的分工
解压后进src,第一眼会看到baseline、targuess、das三个并列目录,外加一堆散落的.py。这不是随手堆的,而是三条独立可跑的分析线:
baseline:基础统计与行为分析。user_pwd_reader.py、user_pwd_behavior.py、user_edit_behavior.py负责读原始口令 CSV、统计用户改密行为、输出structure_analysis.txt和edit_analysis.txt这类中间结果。targuess:目标猜测线。核心是pitg_trainer.py、pitg_model.py、pitg_cracker.py,配合pitg_preprocess.py做数据预处理,pitg_evaluator.py做评估。PITG 是这套源码里最完整的训练闭环。das:Pass2Path 线。pass2path_trainer.py、pass2path_evaluator.py、generate_path.py、generate_inplace_edits.py组成「生成编辑路径 → 训练 → 评估」的链路。
utils目录放sample_data.py和通用工具,draw目录全是绘图脚本,script目录是.sh批处理入口,config和figure分别放配置与架构图。理解这个分层,后面找入口就不会迷路。
2.2 数据流:从 CSV 到命中率曲线
整条链路的数据流是固定的,照着走不会错:
- 原始口令 CSV(含用户名、旧密码、新密码字段)进入
user_pwd_reader.py; - 行为分析脚本产出编辑行为统计,落到
edit_analysis.txt; pitg_preprocess.py把统计结果转成模型可读的序列样本;pitg_trainer.py训练,pitg_evaluator.py用贪婪/集束搜索算命中率;draw下的脚本读评估输出,画成曲线图。
常见做法是先用sample_data.py生成一小份样例数据,把整条链路跑通,再换真实数据集。这样能避免一上来就被数据格式问题卡住。
2.3 环境依赖与最小可跑配置
这套代码依赖 PyTorch、pandas、numpy、matplotlib。我一般会单独建虚拟环境,避免和系统里的包打架:
# 建独立环境,Python 3.8 兼容性最稳 python -m venv pwd_env source pwd_env/bin/activate # Windows 用 pwd_env\Scripts\activate # 装核心依赖,torch 按自己显卡情况选 CPU 或 CUDA 版 pip install torch pandas numpy matplotlib scikit-learn参数说明:torch版本决定后面训练能不能用 GPU,pitg_trainer.py里通常有device判断,CPU 也能跑但慢。pandas用于读 CSV,matplotlib供draw目录调用。装完先别急着训练,跑一遍python -c "import torch; print(torch.__version__)"确认没报错。
提示:如果
import torch报 DLL 相关错误,多半是 CPU/GPU 版本装混了,卸载重装对应版本即可。
3. 把 PITG 训练链路跑通:预处理、训练、评估三步
3.1 预处理:把原始口令转成编辑序列
PITG 的核心思想是把「旧密码 → 新密码」的变换拆成一系列编辑操作(插入、删除、替换、移动)。pitg_preprocess.py就是干这个的。跑之前要确认输入 CSV 的列名和脚本里读的字段一致,否则会直接抛 KeyError。
# 进入 targuess 目录,先跑预处理 cd src/targuess python pitg_preprocess.py \ --input ../data/raw_passwords.csv \ --output ../data/processed/ \ --min_freq 5逻辑说明:脚本读原始 CSV,对每条「旧密码-新密码」对做编辑距离对齐,抽取出高频编辑模式,输出成训练样本。参数--min_freq 5表示出现次数少于 5 的编辑模式被过滤掉,这个值调大能减少噪声但会丢长尾规律,调小则样本更全但训练更慢。我一般先用 5 跑通,再根据样本量调整。
3.2 训练:LSTM + Seq2Seq 的关键参数
pitg_trainer.py是训练入口,内部调用pitg_model.py里的 Seq2Seq 结构,编码器解码器都是 LSTM。训练前重点看三个参数:学习率、batch size、训练轮数。
# 启动训练,输出模型权重到 checkpoints python pitg_trainer.py \ --train_data ../data/processed/train.pkl \ --valid_data ../data/processed/valid.pkl \ --epochs 30 \ --batch_size 64 \ --lr 0.001 \ --save_dir ../checkpoints/逻辑说明:--epochs 30是训练轮数,口令数据模式相对集中,轮数过多容易过拟合;--batch_size 64在显存够的情况下可以调到 128 加速;--lr 0.001是常见起点,如果 loss 震荡就降到 0.0005。训练过程中会打印每轮的 loss 和验证集命中率,盯着验证集指标,别只看训练 loss。
注意:如果 loss 一直不降,先检查预处理输出的样本是不是空的,
train.pkl里样本数为 0 是最常见的翻车原因。
3.3 评估:贪婪搜索与集束搜索的差别
pitg_evaluator.py支持两种解码策略。贪婪搜索每步取概率最高的词,快但容易陷入局部最优;集束搜索保留 top-k 候选,命中率更高但更慢。
# 用集束搜索评估,beam 宽度设 10 python pitg_evaluator.py \ --model ../checkpoints/best_model.pt \ --test_data ../data/processed/test.pkl \ --decode beam \ --beam_width 10 \ --output ../results/eval_result.txt逻辑说明:--decode beam切换解码方式,--beam_width 10是集束宽度,调大命中率通常上升但耗时线性增长。评估输出里会包含 top-10、top-100 命中率,这是衡量口令猜测模型的核心指标。跑完拿results/eval_result.txt去喂draw目录的绘图脚本,就能出曲线。
3.4 可视化:把命中率画成能放进报告的图
draw目录下脚本很多,常用的有draw_targuess_guessrate.py、draw_targuess_guessrate_comparison.py、draw_guessrate_via_editdistance.py。它们读评估结果,输出 PNG。
cd ../draw python draw_targuess_guessrate.py \ --input ../results/eval_result.txt \ --output ../figure/guessrate.png \ --title "PITG Guess Rate"逻辑说明:--input指向评估输出,--output是图片路径,--title控制图标题。对比脚本draw_targuess_guessrate_comparison.py能同时读多份结果画对比曲线,适合把 baseline 和 PITG 放一起比。参数改错最常见的是路径,脚本不会自动找文件,路径必须写对。
4. 避坑与排查:这套源码最容易卡住的五个地方
4.1 现象:预处理报 KeyError,提示找不到列名
原因:pitg_preprocess.py里硬编码了列名(常见是username、old_password、new_password),而你的 CSV 列名可能是中文或别的写法。解决:先用pandas打印df.columns确认列名,要么改 CSV 表头,要么改脚本里的字段映射。别直接改脚本逻辑,改表头更快。
4.2 现象:训练 loss 变成 nan
原因:学习率过大,或者预处理后的序列里有超长样本导致梯度爆炸。解决:把--lr降到 0.0005 甚至 0.0001,同时在pitg_model.py里确认有没有梯度裁剪(常见做法是clip_grad_norm_)。如果还没有,手动加一行裁剪,阈值设 5.0 左右。
4.3 现象:评估命中率全是 0
原因:测试集和训练集的编辑模式分布差异太大,或者评估时读错了模型权重文件。解决:先确认--model指向的是训练产出的best_model.pt而不是空文件;再检查测试集是不是用了和训练集同一套预处理参数,预处理不一致是命中率为 0 的高频原因。
4.4 现象:绘图脚本报中文字体缺失
原因:matplotlib默认字体不含中文,标题里有中文就显示成方框或报 warning。解决:在绘图脚本开头加plt.rcParams['font.sans-serif'] = ['SimHei']和plt.rcParams['axes.unicode_minus'] = False。Linux 下没装 SimHei 就换成系统里有的中文字体。
4.5 现象:script 目录下的 .sh 跑不动
原因:.sh里写死了绝对路径,或者换行符是 Windows 的 CRLF。解决:用sed -i 's/\r$//' xxx.sh去掉回车符,再把里面的路径改成自己机器上的相对路径。跑之前chmod +x xxx.sh给执行权限,这两步做完基本就能跑。
5. 进阶玩法:用 crack_with_username.py 做定向猜测与结果验证
把基础链路跑通后,真正有意思的是crack_with_username.py。它把用户名信息融进猜测过程——因为大量用户会把用户名变形后塞进密码里。这个脚本的用法和评估脚本类似,但输入要多一列用户名,输出的是针对特定用户集的定向猜测结果。
cd src/targuess python crack_with_username.py \ --model ../checkpoints/best_model.pt \ --target_users ../data/processed/target_users.csv \ --top_k 100 \ --output ../results/directed_guess.txt逻辑说明:--target_users是待猜测的用户列表,--top_k 100表示每个用户输出前 100 个候选口令,--output存结果。验证方法很直接:拿输出和真实口令比对,算命中率。我一般会写个小脚本做比对,而不是手工看。
# verify_guess.py 简易验证脚本 import pandas as pd # 读定向猜测结果和真实口令 guesses = pd.read_csv('../results/directed_guess.txt', sep='\t', header=None, names=['username', 'rank', 'guess']) truth = pd.read_csv('../data/processed/truth.csv') # 按用户名合并,判断真实口令是否落在 top_k 里 merged = guesses.merge(truth, on='username') hit = merged[merged['guess'] == merged['password']] hit_rate = hit['username'].nunique() / truth['username'].nunique() print(f'定向命中率: {hit_rate:.4f}')参数说明:sep='\t'要和输出文件的实际分隔符一致,不对就换成逗号。rank列记录候选排序,想看 top-10 命中率就加个merged[merged['rank'] <= 10]过滤。这个验证脚本不依赖原工程,单独跑就行。
进阶方向有两个:一是把--top_k从 100 调到 1000,看命中率曲线的拐点在哪,判断模型是否还有提升空间;二是把 PITG 和 Pass2Path 两条线的结果做交集,交集命中的口令往往置信度更高。我习惯每次改完参数都固定跑一遍验证脚本,把命中率记在表格里,避免凭感觉判断模型好坏。从那以后我每次调参都强制走一遍「训练 → 评估 → 验证」三步,不再只看 loss 就下结论。希望帮到你。
本文还有配套的精品资源,点击获取