習(xí)口令破解分析:LSTM與Seq2Seq源碼實(shí)戰(zhàn))
簡(jiǎn)介本資源為基于Python的密碼破解分析系統(tǒng)源碼包面向具備一定Python與深度學(xué)習(xí)基礎(chǔ)、關(guān)注密碼安全與口令猜測(cè)方向的學(xué)習(xí)者和研究人員。項(xiàng)目圍繞密碼破解數(shù)據(jù)展開(kāi)涵蓋數(shù)據(jù)清洗、分割與標(biāo)準(zhǔn)化等預(yù)處理流程并利用LSTM與Seq2Seq模型進(jìn)行訓(xùn)練通過(guò)貪婪搜索和集束搜索評(píng)估命中率、召回率等指標(biāo)最后借助matplotlib完成結(jié)果可視化幫助讀者理解從數(shù)據(jù)到模型評(píng)估的完整分析鏈路。壓縮包共74個(gè)文件以60個(gè)py源碼文件為核心輔以6個(gè)sh腳本、3個(gè)svg架構(gòu)圖、2個(gè)txt說(shuō)明、2個(gè)json配置及1個(gè)md文檔整體約711KB結(jié)構(gòu)清晰便于按模塊查閱。目前已有62人學(xué)習(xí)下載適合作為密碼安全分析、序列建模與模型評(píng)估的實(shí)踐參考也可用于二次開(kāi)發(fā)與實(shí)驗(yàn)復(fù)現(xiàn)。1. 從一份 Python 密碼破解分析源碼說(shuō)起它到底能跑出什么結(jié)果很多人第一次看到「密碼破解分析系統(tǒng)」這幾個(gè)字腦子里浮現(xiàn)的是暴力跑字典的腳本。但這套基于 Python 的源碼包走的是另一條路它不直接硬碰密碼而是用 LSTM 和 Seq2Seq 去學(xué)習(xí)真實(shí)泄露口令的編輯規(guī)律再拿模型去猜。換句話說(shuō)它研究的是「人怎么改密碼」而不是「機(jī)器怎么撞密碼」。包里同時(shí)給了 Pass2Path、PITG 兩條技術(shù)路線的訓(xùn)練與評(píng)估腳本還有一整套可視化繪圖代碼能直接產(chǎn)出命中率曲線、編輯距離分布圖。適合做安全研究、口令強(qiáng)度評(píng)估、課程設(shè)計(jì)或者想拿一份能跑通的深度學(xué)習(xí)口令分析工程練手的人。下面我按「能干什么 → 怎么裝怎么跑 → 坑在哪 → 怎么驗(yàn)證」的順序拆一遍。2. 先看清工程結(jié)構(gòu)src 目錄里到底藏了哪幾條技術(shù)線2.1 baseline、targuess、das 三個(gè)目錄的分工解壓后進(jìn)src第一眼會(huì)看到baseline、targuess、das三個(gè)并列目錄外加一堆散落的.py。這不是隨手堆的而是三條獨(dú)立可跑的分析線baseline基礎(chǔ)統(tǒng)計(jì)與行為分析。user_pwd_reader.py、user_pwd_behavior.py、user_edit_behavior.py負(fù)責(zé)讀原始口令 CSV、統(tǒng)計(jì)用戶改密行為、輸出structure_analysis.txt和edit_analysis.txt這類中間結(jié)果。targuess目標(biāo)猜測(cè)線。核心是pitg_trainer.py、pitg_model.py、pitg_cracker.py配合pitg_preprocess.py做數(shù)據(jù)預(yù)處理pitg_evaluator.py做評(píng)估。PITG 是這套源碼里最完整的訓(xùn)練閉環(huán)。dasPass2Path 線。pass2path_trainer.py、pass2path_evaluator.py、generate_path.py、generate_inplace_edits.py組成「生成編輯路徑 → 訓(xùn)練 → 評(píng)估」的鏈路。utils目錄放sample_data.py和通用工具draw目錄全是繪圖腳本script目錄是.sh批處理入口config和figure分別放配置與架構(gòu)圖。理解這個(gè)分層后面找入口就不會(huì)迷路。2.2 數(shù)據(jù)流從 CSV 到命中率曲線整條鏈路的數(shù)據(jù)流是固定的照著走不會(huì)錯(cuò)原始口令 CSV含用戶名、舊密碼、新密碼字段進(jìn)入user_pwd_reader.py行為分析腳本產(chǎn)出編輯行為統(tǒng)計(jì)落到edit_analysis.txtpitg_preprocess.py把統(tǒng)計(jì)結(jié)果轉(zhuǎn)成模型可讀的序列樣本pitg_trainer.py訓(xùn)練pitg_evaluator.py用貪婪/集束搜索算命中率draw下的腳本讀評(píng)估輸出畫成曲線圖。常見(jiàn)做法是先用sample_data.py生成一小份樣例數(shù)據(jù)把整條鏈路跑通再換真實(shí)數(shù)據(jù)集。這樣能避免一上來(lái)就被數(shù)據(jù)格式問(wèn)題卡住。2.3 環(huán)境依賴與最小可跑配置這套代碼依賴 PyTorch、pandas、numpy、matplotlib。我一般會(huì)單獨(dú)建虛擬環(huán)境避免和系統(tǒng)里的包打架# 建獨(dú)立環(huán)境Python 3.8 兼容性最穩(wěn) 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參數(shù)說(shuō)明torch版本決定后面訓(xùn)練能不能用 GPUpitg_trainer.py里通常有device判斷CPU 也能跑但慢。pandas用于讀 CSVmatplotlib供draw目錄調(diào)用。裝完先別急著訓(xùn)練跑一遍python -c import torch; print(torch.__version__)確認(rèn)沒(méi)報(bào)錯(cuò)。提示如果import torch報(bào) DLL 相關(guān)錯(cuò)誤多半是 CPU/GPU 版本裝混了卸載重裝對(duì)應(yīng)版本即可。3. 把 PITG 訓(xùn)練鏈路跑通預(yù)處理、訓(xùn)練、評(píng)估三步3.1 預(yù)處理把原始口令轉(zhuǎn)成編輯序列PITG 的核心思想是把「舊密碼 → 新密碼」的變換拆成一系列編輯操作插入、刪除、替換、移動(dòng)。pitg_preprocess.py就是干這個(gè)的。跑之前要確認(rèn)輸入 CSV 的列名和腳本里讀的字段一致否則會(huì)直接拋 KeyError。# 進(jìn)入 targuess 目錄先跑預(yù)處理 cd src/targuess python pitg_preprocess.py \ --input ../data/raw_passwords.csv \ --output ../data/processed/ \ --min_freq 5邏輯說(shuō)明腳本讀原始 CSV對(duì)每條「舊密碼-新密碼」對(duì)做編輯距離對(duì)齊抽取出高頻編輯模式輸出成訓(xùn)練樣本。參數(shù)--min_freq 5表示出現(xiàn)次數(shù)少于 5 的編輯模式被過(guò)濾掉這個(gè)值調(diào)大能減少噪聲但會(huì)丟長(zhǎng)尾規(guī)律調(diào)小則樣本更全但訓(xùn)練更慢。我一般先用 5 跑通再根據(jù)樣本量調(diào)整。3.2 訓(xùn)練LSTM Seq2Seq 的關(guān)鍵參數(shù)pitg_trainer.py是訓(xùn)練入口內(nèi)部調(diào)用pitg_model.py里的 Seq2Seq 結(jié)構(gòu)編碼器解碼器都是 LSTM。訓(xùn)練前重點(diǎn)看三個(gè)參數(shù)學(xué)習(xí)率、batch size、訓(xùn)練輪數(shù)。# 啟動(dòng)訓(xùn)練輸出模型權(quán)重到 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/邏輯說(shuō)明--epochs 30是訓(xùn)練輪數(shù)口令數(shù)據(jù)模式相對(duì)集中輪數(shù)過(guò)多容易過(guò)擬合--batch_size 64在顯存夠的情況下可以調(diào)到 128 加速--lr 0.001是常見(jiàn)起點(diǎn)如果 loss 震蕩就降到 0.0005。訓(xùn)練過(guò)程中會(huì)打印每輪的 loss 和驗(yàn)證集命中率盯著驗(yàn)證集指標(biāo)別只看訓(xùn)練 loss。注意如果 loss 一直不降先檢查預(yù)處理輸出的樣本是不是空的train.pkl里樣本數(shù)為 0 是最常見(jiàn)的翻車原因。3.3 評(píng)估貪婪搜索與集束搜索的差別pitg_evaluator.py支持兩種解碼策略。貪婪搜索每步取概率最高的詞快但容易陷入局部最優(yōu)集束搜索保留 top-k 候選命中率更高但更慢。# 用集束搜索評(píng)估beam 寬度設(shè) 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邏輯說(shuō)明--decode beam切換解碼方式--beam_width 10是集束寬度調(diào)大命中率通常上升但耗時(shí)線性增長(zhǎng)。評(píng)估輸出里會(huì)包含 top-10、top-100 命中率這是衡量口令猜測(cè)模型的核心指標(biāo)。跑完拿results/eval_result.txt去喂draw目錄的繪圖腳本就能出曲線。3.4 可視化把命中率畫成能放進(jìn)報(bào)告的圖draw目錄下腳本很多常用的有draw_targuess_guessrate.py、draw_targuess_guessrate_comparison.py、draw_guessrate_via_editdistance.py。它們讀評(píng)估結(jié)果輸出 PNG。cd ../draw python draw_targuess_guessrate.py \ --input ../results/eval_result.txt \ --output ../figure/guessrate.png \ --title PITG Guess Rate邏輯說(shuō)明--input指向評(píng)估輸出--output是圖片路徑--title控制圖標(biāo)題。對(duì)比腳本draw_targuess_guessrate_comparison.py能同時(shí)讀多份結(jié)果畫對(duì)比曲線適合把 baseline 和 PITG 放一起比。參數(shù)改錯(cuò)最常見(jiàn)的是路徑腳本不會(huì)自動(dòng)找文件路徑必須寫對(duì)。4. 避坑與排查這套源碼最容易卡住的五個(gè)地方4.1 現(xiàn)象預(yù)處理報(bào) KeyError提示找不到列名原因pitg_preprocess.py里硬編碼了列名常見(jiàn)是username、old_password、new_password而你的 CSV 列名可能是中文或別的寫法。解決先用pandas打印df.columns確認(rèn)列名要么改 CSV 表頭要么改腳本里的字段映射。別直接改腳本邏輯改表頭更快。4.2 現(xiàn)象訓(xùn)練 loss 變成 nan原因?qū)W習(xí)率過(guò)大或者預(yù)處理后的序列里有超長(zhǎng)樣本導(dǎo)致梯度爆炸。解決把--lr降到 0.0005 甚至 0.0001同時(shí)在pitg_model.py里確認(rèn)有沒(méi)有梯度裁剪常見(jiàn)做法是clip_grad_norm_。如果還沒(méi)有手動(dòng)加一行裁剪閾值設(shè) 5.0 左右。4.3 現(xiàn)象評(píng)估命中率全是 0原因測(cè)試集和訓(xùn)練集的編輯模式分布差異太大或者評(píng)估時(shí)讀錯(cuò)了模型權(quán)重文件。解決先確認(rèn)--model指向的是訓(xùn)練產(chǎn)出的best_model.pt而不是空文件再檢查測(cè)試集是不是用了和訓(xùn)練集同一套預(yù)處理參數(shù)預(yù)處理不一致是命中率為 0 的高頻原因。4.4 現(xiàn)象繪圖腳本報(bào)中文字體缺失原因matplotlib默認(rèn)字體不含中文標(biāo)題里有中文就顯示成方框或報(bào) warning。解決在繪圖腳本開(kāi)頭加plt.rcParams[font.sans-serif] [SimHei]和plt.rcParams[axes.unicode_minus] False。Linux 下沒(méi)裝 SimHei 就換成系統(tǒng)里有的中文字體。4.5 現(xiàn)象script 目錄下的 .sh 跑不動(dòng)原因.sh里寫死了絕對(duì)路徑或者換行符是 Windows 的 CRLF。解決用sed -i s/\r$// xxx.sh去掉回車符再把里面的路徑改成自己機(jī)器上的相對(duì)路徑。跑之前chmod x xxx.sh給執(zhí)行權(quán)限這兩步做完基本就能跑。5. 進(jìn)階玩法用 crack_with_username.py 做定向猜測(cè)與結(jié)果驗(yàn)證把基礎(chǔ)鏈路跑通后真正有意思的是crack_with_username.py。它把用戶名信息融進(jìn)猜測(cè)過(guò)程——因?yàn)榇罅坑脩魰?huì)把用戶名變形后塞進(jìn)密碼里。這個(gè)腳本的用法和評(píng)估腳本類似但輸入要多一列用戶名輸出的是針對(duì)特定用戶集的定向猜測(cè)結(jié)果。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邏輯說(shuō)明--target_users是待猜測(cè)的用戶列表--top_k 100表示每個(gè)用戶輸出前 100 個(gè)候選口令--output存結(jié)果。驗(yàn)證方法很直接拿輸出和真實(shí)口令比對(duì)算命中率。我一般會(huì)寫個(gè)小腳本做比對(duì)而不是手工看。# verify_guess.py 簡(jiǎn)易驗(yàn)證腳本 import pandas as pd # 讀定向猜測(cè)結(jié)果和真實(shí)口令 guesses pd.read_csv(../results/directed_guess.txt, sep\t, headerNone, names[username, rank, guess]) truth pd.read_csv(../data/processed/truth.csv) # 按用戶名合并判斷真實(shí)口令是否落在 top_k 里 merged guesses.merge(truth, onusername) hit merged[merged[guess] merged[password]] hit_rate hit[username].nunique() / truth[username].nunique() print(f定向命中率: {hit_rate:.4f})參數(shù)說(shuō)明sep\t要和輸出文件的實(shí)際分隔符一致不對(duì)就換成逗號(hào)。rank列記錄候選排序想看 top-10 命中率就加個(gè)merged[merged[rank] 10]過(guò)濾。這個(gè)驗(yàn)證腳本不依賴原工程單獨(dú)跑就行。進(jìn)階方向有兩個(gè)一是把--top_k從 100 調(diào)到 1000看命中率曲線的拐點(diǎn)在哪判斷模型是否還有提升空間二是把 PITG 和 Pass2Path 兩條線的結(jié)果做交集交集命中的口令往往置信度更高。我習(xí)慣每次改完參數(shù)都固定跑一遍驗(yàn)證腳本把命中率記在表格里避免憑感覺(jué)判斷模型好壞。從那以后我每次調(diào)參都強(qiáng)制走一遍「訓(xùn)練 → 評(píng)估 → 驗(yàn)證」三步不再只看 loss 就下結(jié)論。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取