# passgpt **Repository Path**: ma_yu_ke/passgpt ## Basic Information - **Project Name**: passgpt - **Description**: Password Modeling and (Guided) Generation with Large Language Models. Forked by https://github.com/javirandor/passgpt - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-04-10 - **Last Updated**: 2026-04-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PassGPT:使用大型语言模型进行密码建模与(引导式)生成 PassGPT: Password Modeling and (Guided) Generation with Large Language Models Fork by https://github.com/javirandor/passgpt ----------- 本仓库包含PassGPT模型的官方实现。详情请见[论文](https://arxiv.org/abs/2306.01545)。 ## 概述 - PassGPT是一个[GPT - 2模型](https://huggingface.co/docs/transformers/model_doc/gpt2),从零开始在密码泄露数据上进行训练。 - PassGPT在猜测之前未见过的密码数量方面,比基于生成对抗网络(GAN)的现有方法高出两倍。 - 我们引入了引导式密码生成的概念,在这种概念下,我们调整采样程序以生成满足任意约束条件的密码,这是当前基于GAN的策略所缺乏的功能。 - PassGPT分配给密码的概率可用于增强现有的密码强度估计器。 ## 环境 ```bash pip install -r requirements -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com ``` ## 数据集 在我们的工作中,我们在[RockYou密码泄露数据](https://www.skullsecurity.org/wiki/Passwords)上训练PassGPT。您还可以在此处找到[Hotmail数据集](https://www.skullsecurity.org/wiki/Passwords)以及[LinkedIN数据集](https://github.com/brannondorsey/PassGAN/releases/download/data/68_linkedin_found_hash_plain.txt.zip)。 下载数据放置目录示例:data/rockyou/rockyou.txt,data/rockyou/rockyou-withcount.txt更多数据集分析查看[README.md](data_analysis%2FREADME.md) 数据集分析 ```bash python data_analysis/data_analysis.py ``` 数据预处理 ```bash sh ./scripts/preprocess.sh > preprocess-log.txt ``` 这里的预处理方式参考了https://github.com/Suxyuuu/PagPassGPT 分别保留长度为<=10,<=16,以及4-12的唯一密码, 并默认按照8:2划分训练集和测试集,且训练集和测试集没有交集。 在创建训练集时,我们采用了PassGPT中相同的描述,确保测试集中密码频次<=7次,可以在训练过程中未见的低概率密码上测试模型的生成能力。 经[cal_test_data_count.py](data_analysis%2Fcal_test_data_count.py)计算得到测试集中密码平均频次为1.27(max16),原论文中是1.03 ## 使用PassGPT官方的预训练模型生成密码 您可以从HuggingFace下载我们的预训练模型。这些是原始论文中报告的模型的精心整理版本。词汇量大小已减小,并且对训练进行了优化。预计结果会稍好一些。 您可以在此处不受限制地访问在最多10个字符的密码上训练的PassGPT [这里](https://huggingface.co/javirandor/passgpt-10characters/)。在最多16个字符的密码上训练的版本需要我们团队的研究批准,您可以在[这里](https://huggingface.co/javirandor/passgpt-16characters/)找到它。 若因网络原因无法下载可以通过镜像网站https://hf-mirror.com下载[10characters](https://hf-mirror.com/javirandor/passgpt-10characters),[16characters](https://hf-mirror.com/javirandor/passgpt-16characters) 或者通过网盘下载模型文件:[passgpt-10characters链接](https://pan.baidu.com/s/1tOzwhSGNosmuaih6gWeVyw?pwd=qqvg),[passgpt-16characters链接](https://pan.baidu.com/s/143XRc9Ln5CBKhwS3G5tjbA?pwd=giq9) 下载模型放置路径:models/javirandor/passgpt-10characters 然后,您可以使用代码[official_demo.py](official_demo.py)使用我们的预训练模型生成`NUM_GENERATIONS`个密码。它甚至可以在CPU上运行!要扩大您的生成规模,您可以使用[generate_passwords.py](src%2Fgenerate_passwords.py)。 ```bash cd src python generate_passwords.py \ --model_path ../models/javirandor/passgpt-10characters \ --tokenizer_path ../models/javirandor/passgpt-10characters \ --train_data_path ../data/rockyou/rockyou.txt \ --out_path ../output/password_10char/password_1e6 \ --num_generate 1000000 ``` ```bash cd src python generate_passwords.py \ --model_path ../models/javirandor/passgpt-16characters \ --tokenizer_path ../models/javirandor/passgpt-16characters \ --train_data_path ../data/rockyou/rockyou.txt \ --out_path ../output/password_16char/password_1e5 \ --num_generate 100000 ``` ## 训练你自己的模型和结果复现 若要在某个数据集上训练你自己的 PassGPT 模型,你需要遵循以下步骤。你也可以选择调整这段代码,以便在不同的数据集上微调预训练模型。 下面以训练密码最多10字符长度的模型为例,其他长度的模型训练方式类似,尝试复现论文中的结果。 ### 1. 为你的密码创建一个分词器 重要的是,这个分词器是字符级别的,避免了自然语言处理中常见的将多个字母拼接成单个标记的情况。 这样做是为了在模型下保留有意义的概率分布。根据你的任务需求,你可能需要对其进行调整,使其表达能力更强。 ``` python src/create_tokenizer.py \ --train_path ./data/rockyou/rockyou-cleaned/passwords_max_10/passwords_max_10-Train.txt \ --output_path ./models/tokenizer/passwords_max_10 ``` ### 2. 自定义你的训练配置文件 并将其存储在 CONFIG_PATH 中。你可以使用[this template](https://github.com/javirandor/passbert/blob/main/configs/passgpt-16chars.yaml). 这里创建配置[passgpt-10chars.yaml](configs%2Fpassgpt-10chars.yaml),在Tesla V100上支持混合精度训练,可以将fp16设置为True,加速训练过程。 per_device_train_batch_size参数设置为64或32甚至更小,可以减少显存占用,但是会降低训练速度。设置为32大概需要训练12个小时。 ### 3. Train PassGPT 在src/train_passgpt.py中通过os.environ["CUDA_VISIBLE_DEVICES"] = "1"设置使用的GPU设备编号,PassGPT默认只能单卡训练 运行命令: ``` cd src python train_passgpt.py \ --config_path ../configs/passgpt-10chars.yaml ``` 模型结构: ``` GPT2LMHeadModel( (transformer): GPT2Model( (wte): Embedding(99, 768) (wpe): Embedding(1024, 768) (drop): Dropout(p=0.1, inplace=False) (h): ModuleList( (0-7): 8 x GPT2Block( (ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (attn): GPT2Attention( (c_attn): Conv1D(nf=2304, nx=768) (c_proj): Conv1D(nf=768, nx=768) (attn_dropout): Dropout(p=0.1, inplace=False) (resid_dropout): Dropout(p=0.1, inplace=False) ) (ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True) (mlp): GPT2MLP( (c_fc): Conv1D(nf=3072, nx=768) (c_proj): Conv1D(nf=768, nx=3072) (act): NewGELUActivation() (dropout): Dropout(p=0.1, inplace=False) ) ) ) (ln_f): LayerNorm((768,), eps=1e-05, elementwise_affine=True) ) (lm_head): Linear(in_features=768, out_features=99, bias=False) ) ``` 训练日志示例: ```text {'train_runtime': 45331.5575, 'train_samples_per_second': 628.224, 'train_steps_per_second': 19.632, 'train_loss': 2.243805736835582, 'epoch': 3.0} 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 889950/889950 [12:35:29<00:00, 19.63it/s] ===> Training completed after 12:35:31.836186. Storing last version. ``` ### 4. 使用训练好的模型生成密码 ``` python src/generate_passwords.py \ --model_path ./models/passwords_max_10/last \ --tokenizer_path ./models/tokenizer/passwords_max_10/byte_bpe_tokenizer_99 \ --out_path ./output/passwords_max_10 \ --train_data_path ./data/rockyou/rockyou-cleaned/passwords_max_10/passwords_max_10-Train.txt \ --eval_data_path ./data/rockyou/rockyou-cleaned/passwords_max_10/passwords_max_10-Test.txt \ --num_generate 100000000 ``` 此外,你还可以进一步调整生成参数,例如 --temperature、--top_p 或 --top_k。 ### 结果记录 模型路径:../models/passwords_max_10/last | 生成密码数量 | 唯一密码数量 | 唯一密码占比 | 测试集重合密码数量 | 测试集重合占比 | 训练集重合密码数量 | 训练集重合占比 | |--------| --- |--------| --- | --- |-----------| --- | | 10^4 | 9998 | 99.98% | 256 | 0.01079% | 1158 | 0.01220% | | 10^5 | 99921 | 99.92% | 2659 | 0.11204% | 11196 | 0.11795% | | 10^6 | 993636 | 99.36% | 26121 | 1.10068% | 109472 | 1.15326% | | 10^7 | 9481469 | 94.81% | 208226 | 8.77415% | 871055 | 9.17635% | | 10^8 | 78117662 | 78.12% | 734710 | 30.95893% | 3020897 | 31.82441% | 模型路径:./models/passwords_max_16/last | 生成密码数量 | 唯一密码数量 | 唯一密码占比 | 测试集重合密码数量 | 测试集重合占比 | 训练集重合密码数量 | 训练集重合占比 | 生成消耗时间(s) | |--------| --- |--------| --- | --- | --- | --- |-----------| | 10^4 | 9998 | 99.98% | 280 | 0.00990% | 1035 | 0.00915% | 3.56 | | 10^5 | 99834 | 99.83% | 2459 | 0.08693% | 10434 | 0.09221% | 31.43 | | 10^6 | 990036 | 99.00% | 23950 | 0.84664% | 99728 | 0.88137% | 406.22 | | 10^7 | 9451967 | 94.52% | 189481 | 6.69820% | 790780 | 6.98874% | 4209 | ### 复现结果对比 复现的结果与PassGPT原始论文中的结果对比 表 2:从 10^7 次生成结果中猜出的 RockYou 测试集(10 个字符及以下)密码的百分比。模型分别在 RockYou 数据集的所有密码或唯一条目上进行训练。 | Architecture | Trained on | Test set guessed(原论文) | Test set guessed(复现结果) | |--------------|------------|-----------------------|------------------------| | PassGPT | 唯一密码Unique | 4.25% | 8.77% | | PassGPT | 所有密码All | 0.53% | / | 表 3:不同模型生成的样本与 RockYou 测试集(少于 10 个字符)的匹配百分比。 PassGAN* 代表文献 [36] 中提出的改进版 PassGAN。 生成对抗网络(GANs)的结果直接取自原始论文 [25, 36],未进行复现。 |Guesses| PassGAN | PassGAN* | PassGPT | PassGPT(复现) | |-------|---------|----------|---------|-------------| |10^4 | 0.01% | - | 0.01% | 0.01% | |10^5 | 0.05% | - | 0.05% | 0.11% | |10^6 | 0.38% | - | 0.50% | 1.10% | |10^7 | 2.04% | - | 4.25% | 8.77% | |10^8 | 6.73% | 9.51% | 19.37% | 30.96% | |10^9 | 15.09% | 23.33% | 41.86% | / | 图3:不同模型生成的唯一密码占比折线图 原文是折线图,这里简化为表格 | Model | 10^4 | 10^5 | 10^6 | 10^7 | 10^8 | 10^9 | |-------|------|------|------|------|--------|------| | PassGPT(原论文大概) | 99% | 99% | 98% | 95% | 80% | 59% | | PassGPT(复现) | 99.98% | 99.92% | 99.36% | 94.81% | 78.12% | / | | PassGAN | 98% | 94% | 85% | 70% | 52% | 35% | 唯一密码占比越高,说明生成的重复密码越少。 表 4:猜中 LinkedIn 测试集密码的百分比。各列表示训练分布情况。测试集不包含 RockYou 训练集中的密码。 |Guesses| PassGPT | PassGPT | |-------|---------|----------| |-| Rockyou | Linkedin | 表6:来自PassGPT的引导生成示例。l:小写字母,u:大写字母,d:数字,p:标点符号,*:任意字符 复现结果是在<=10个字符的Rockyou训练集上训练的模型引导生成的结果 | Templates | llllll | lllldd | ullppdd | uuuu**dd | |-----------| --- | --- | --- | --- | | paper | orange | manb13 | Nms__12 | PARLA198 | | paper | iluvma | sall89 | Zac&&09 | CELAN777 | | paper | gikiyd | lowm12 | Chl@(18 | QWER1234 | | Our reproduce| treecu | terr31 | Mon-+16 | SAVAGE13 | | Our reproduce| coldma | cour22 | Pis_#08 | SHONTA01 | | Our reproduce| interp | bria91 | Mar;(99 | ILUVYO03 | | Our reproduce| yareth | josh11 | Chr!$83 | RICH4401 | | Our reproduce| nadelu | wats01 | Zal-:80 | DAVID&06 | ### 公式 4(总对数概率) $$ \log_{10} p(x; \theta) = \sum_{i=1}^{n} \log_{10} p(x_i | x_1, \ldots, x_{i-1}; \theta) $$ #### 含义 计算一个密码 $x = [x_1, x_2, \ldots, x_n]$ 的总对数概率。 #### 符号解释 - $\log_{10} p(x; \theta)$:密码 $x$ 在模型参数 $\theta$ 下的以 10 为底的对数概率。 - $n$:密码 $x$ 的长度。 - $p(x_i | x_1, \ldots, x_{i-1}; \theta)$:在给定前面 $i - 1$ 个字符 $x_1, \ldots, x_{i-1}$ 和模型参数 $\theta$ 的条件下,第 $i$ 个字符 $x_i$ 出现的概率。 #### 计算过程 对密码中每个字符的条件概率取以 10 为底的对数,然后将这些对数相加,得到整个密码的总对数概率。 ### 公式 5(熵计算) $$H(X_i) = \sum_{x_i \in \Sigma} p(x_i | x_{