论文复现:通过双向transformer改进现实世界的密码猜测攻击
原文章链接:[Improving Real-world Password Guessing Attacks via Bi-directional Transformers](Improving Real-world Password Guessing Attacks via Bi-directional Transformers | USENIX)
概述
密码猜测攻击可视为对文本令牌概率分布的近似建模。自然语言处理(NLP)中的双向Transformer因其能利用双向上下文捕捉文本细微特征的能力,为密码猜测提供了新思路。本文提出了一种基于双向Transformer的密码猜测框架PassBERT,采用“预训练-微调”范式,首先生成预训练密码模型以学习通用密码分布,随后针对以下三类现实攻击场景设计微调方法:
- 条件密码猜测(CPG):基于已知的密码策略或用户行为规律生成猜测列表,利用规则缩小搜索范围。
- 场景:某公司密码策略要求“8位以上,包含大写字母和数字”。
- 攻击方法:生成
Pass1234
、Hello2023
等符合规则的组合,而非盲目尝试纯数字或全小写密码。 - 工具:使用
Hashcat
的规则引擎,定义掩码(如?u?l?l?l?d?d?d?d
)批量生成候选密码。
- 定向密码猜测(TPG):利用用户个人信息(如历史密码)破解特定用户的密码;
- 场景:攻击目标在社交媒体发布“刚收养了小猫Cookie,生日是7月5日”。
- 攻击方法:生成
Cookie0705!
、ILoveCookie#
等组合,而非通用字典中的密码。 - 工具:通过
CeWL
爬取目标社交媒体内容,提取关键词生成定制字典。
- 自适应规则密码猜测(ARPG):为密码基词选择适配的变形规则以生成候选密码。动态调整猜测策略,根据目标系统的反馈(如错误提示、锁定策略)优化攻击规则。
- 场景:某网站提示“密码不能包含用户名”且“连续错误5次会锁定账户”。
- 攻击方法:
- 首轮尝试排除包含用户名的组合(如避免
user123
)。 - 若前4次失败,第5次暂停攻击,切换IP或账户继续。
- 首轮尝试排除包含用户名的组合(如避免
- 工具:使用
Burp Suite
拦截登录请求,分析响应信息动态调整攻击参数。
双向Transformer:利用自注意力机制同时捕捉输入序列全局上下文信息的神经网络架构,核心特点在于其能够并行处理整个序列。每个位置的词可同时关注序列中所有其他位置(包括前后词),而非仅左侧或右侧。
当阅读一句话时,遇到生词“耷拉”。人类会同时看前后的词(如“耳朵耷拉着”),结合上下文推测词义。双向Transformer类似这种“全局阅读”能力,而单向模型只能根据前半句(如“狗的耳朵…”)猜测。
预训练策略:通过随机掩盖部分输入词(如“猫[MASK]在沙发上”),模型利用双向上下文预测被掩盖的词。
研究方法
这篇文章中做的现实世界密码猜测攻击的核心目标是在有限的猜测次数预算下,最大化成功破解的密码数量。攻击者会收集与攻击相关的特定信息(例如部分密码、历史密码或广泛使用的变形规则),并通常采用监督学习方法,学习从输入集合到关联输出集合之间的映射函数。
数据集处理
-
定向猜测攻击(TPG)采用包含邮箱信息的数据集;非定向猜测攻击(CPG、ARPG)采用纯文本密码数据集。此外预训练模型也采用纯文本密码数据集。
-
TPG中针对每个用户基于相同邮箱地址合并账户。
-
数据集清洗:过滤原始数据中的哈希密码、非ASCII密码及超过32个字符的异常长密码。
-
数据集存储方式:采用TFRecord技术存储密码文本。TFRecord是TensorFlow专用的二进制文件格式,其特点包括:
- 高效存储:通过Protocol Buffers序列化数据,适合结构化数据(如密码文本)的分批存储与快速读取;
- 训练优化:与TensorFlow数据管道(
tf.data
)深度集成,可并行化读取数据以加速模型训练。
可供采用的存储优化手段:
-
列式存储方案(Apache Parquet):将密码的每个特征(如长度、字符类型)独立存储为列。页式结构:每个列数据划分为页(Page),采用RLE/Dictionary编码
全盘扫描快,占用空间小
-
内存映射数据库(LMDB):随机读取更快
在代码中,将原始密码文本转换为TFRecord格式的脚本是
data_utils.py
三种攻击方式的监督学习设置
监督学习:我们将监督信号表示为数据集X及其对应的标签集Y,通过训练监督模型以实现将每个x∈X映射到其标签/类别y∈Y的目标。在训练过程中,模型通过逐步更新参数(即权重),使得给定输入实例x时,其输出尽可能接近标签y。这一目标通过最小化衡量预测输出与期望输出之间差异的损失函数实现(Loss函数最小),本文主要采用交叉熵损失函数。
- CPG的监督信号由部分密码及其对应的完整密码构成。CPG通过训练模型,使其能够根据部分密码预测正确密码。模型的输出直接作为密码候选集。
- TPG的监督信号包含密码及其通过动态规划算法(实现见[35])计算的最短编辑路径。编辑路径由原子编辑操作(攻击设计中预定义)序列构成,例如(删除,8)、(删除,9)、(删除,10)等操作序列,可将密码转换为其变体。给定泄露密码后,TPG模型会输出具有不同置信度的多个编辑路径。攻击者通过将编辑路径应用于泄露密码生成变体作为密码候选,用于破解同一用户的其他密码。
- ARPG的监督信号由词汇及其命中规则(基于两个假设数据集间的命中信息筛选出的规则子集,例如"删除最后三个字符")组成。ARPG模型输出自适应规则,这些规则被应用于基础词汇以生成密码候选。由于自适应规则通常与词汇具有更高的适配性,使得生成的候选密码能更早命中目标。ARPG使用的变形规则定义于Hashcat工具中,大多数变形规则可由原子规则组合而成(例如"删除最后三个字符"是三次"删除最后一个字符"原子规则的组合),能自然模拟对基础词汇顺序应用多条规则的场景。
为什么采用双向Transformer
作为文本数据,密码同样展现出双向性特征。相较于单向表征(每个字符仅关联其前序字符),我们发现在双向上下文中字符间的关联模式存在显著差异,并总结出密码的双向性特征如下:
- 序列性(Sequentiality):字符通常与其相邻字符呈现更强的关联性,这也可视为单向性的一种延伸表现;
- 聚合性(Aggregation):相关字符的内部序列(例如"password123"中的"p@ssw0rd"与"123"、“mike199730"中的"199730”)展现出更密集的连接线。
我们假设,捕捉密码的双向表征能够生成更优质的候选密码,从而提升密码猜测效率。这种双向建模方式使模型能够同时学习字符的前后依赖关系,突破传统单向模型的局限性。

预训练模型
-
由于密码通常比自然语言句子更短且缺乏预设词典(如自然语言中的单词),我们将密码分词为字符序列(就是单字符),并添加表示起始([CLS])和结束([SEP])的特殊符号。
-
将密码最大长度设为32个字符,包含95个ASCII字符(记为∑)及起始符、终止符、占位符和未知符共4个额外符号,总计99个有效字符。
-
采用BERT的15%随机掩码策略(80%替换为[MASK],10%随机字符,10%保持原样)
-
数据集采用Rockyou-2021数据集的6千万样本子集,每个密码生成20个变体
变体即一种数据增强手段,例如p@ssw0rd123,那么可能产生的变体
- p @ [MASK] s w 0 [MASK] d 1 2 3:第3、7位替换为[MASK]
- p @ s s q 0 r d 1 2 3:随机替换第5位
- p@ssw0rd123:不变
PassBERT的预训练阶段使用了MLM(掩码语言模型)目标,但未采用NSP(下一句预测)。为何在密码场景中NSP被忽略?这种设计是否会影响模型对密码序列全局模式的理解?
微调阶段
1. 条件密码猜测(CPG - Conditional Password Guessing)
目标:通过已知部分字符(称为"pivot",如 p***w0rd***
)预测完整密码。
技术实现:
- 模型架构:基于预训练的Transformer模型(如BERT),修改掩码机制:
- 将密码中50%的字符替换为掩码符号(如
*
),保留至少4个可见字符和5个掩码。 - 训练模型预测掩码位置的字符,生成候选密码。
- 将密码中50%的字符替换为掩码符号(如
- 训练数据:使用Rockyou-2009数据集生成带掩码的密码样本。
- 评估:在Neopets和Cit0day数据集上测试,生成10^7个候选密码,按密码出现频率分为四类(常见、不常见、稀有、超稀有)。
实验结果:
- PassBERT(密码预训练模型)表现最佳,破解率比传统方法(CWAE)平均提升14.53%。
- 预训练模型在低频密码(如超稀有类)中效果显著,因模型能捕捉全局密码分布。
2. 定向密码猜测(TPG - Targeted Password Guessing)
目标:利用用户的历史密码生成变体,攻击同一用户的其他账户。
技术实现:
- 模型架构:使用序列标注机制,将密码转换为编辑路径(如替换、删除、插入):
- 预定义编辑操作:保留(keep)、删除(del)、替换1字符(rep1)、替换2字符(rep2)。
- 模型预测每个字符的编辑操作,生成密码变体。
- 训练数据:从BreachCompilation数据集中提取用户密码对,要求最小编辑距离≤4。
- 评估:在105个用户账户上测试,生成最多1000个候选密码。
实验结果:
- PassBERT比传统方法(Pass2path)平均提升21.82%的破解率。
- 预训练对TPG效果有限,因攻击依赖个性化密码变换,与全局密码分布关联较小。
3. 自适应基于规则的密码猜测(ARPG - Adaptive Rule-based Password Guessing)
目标:动态选择最适合当前单词的密码规则(如大小写转换、添加数字),提升规则攻击效率。
技术实现:
- 模型架构:将任务建模为多标签分类问题:
- 输入单词,输出每个规则(如Hashcat的PasswordPro规则集)的适配概率。
- 使用焦点损失(Focal Loss)处理类别不平衡(95%规则不适用)。
- 训练数据:使用BreachCompilation作为目标密码集,000Webhost作为单词集。
- 评估:在Neopets和Cit0day数据集上测试,对比传统方法(ADaMs)。
实验结果:
- PassBERT比ADaMs平均提升4.86%的破解率。
- 密码预训练显著提升效果,因模型需理解密码结构以匹配规则。
微调数据集:
- 目标密码集 T:
- 来源:使用公开泄露的密码库(如BreachCompilation,约2亿条密码),去除非密码内容(如邮箱)。
- 作用:作为标签生成的依据,判断规则是否适配单词(规则应用后生成的密码需命中 T)。
- 单词集 W:
- 来源:常用词典或泄露的词汇库(如000Webhost,约1000万唯一单词)。
- 作用:提供待变形的基础单词(如
password
,sunshine
)。
- 规则集 R:
- 来源:密码破解工具(如Hashcat)的规则集,例如:
- PasswordPro:3,120条常用规则(如大小写变换、追加数字)。
- Generated:14,278条扩展规则(复杂组合)。
- 作用:定义所有可能的变形操作,用于生成候选密码。
- 来源:密码破解工具(如Hashcat)的规则集,例如:
相当于对于每一个W中的单词,我都用R中的规则作用在其上,生成的新单词在T中进行比对,如果新单词在T中存在,就把生成该新单词的规则记为1;不存在就记为0。最后每一个W中的单词都会对应一个01向量规则,这个向量的长度即3120(如果规则集用的是PasswordPro)
在构建微调数据集时,其数据集为二元组集合,i为所有W中单词的个数,是按字符处理单词,即password → [CLS] p a s s w o r d [SEP]
在微调后的模型中,输入为一个单词,而输出则为适用于该单词的3120个规则的概率。
在数据集中,通常标签
0
占比很高,在这篇文章中是一方面用预训练让模型已经能够学会一些常见变形规则,在微调时能让单词快速定位到其对应的规则上。另一方面使用焦点损失的方法,提升正样本的权重
评估方式:
目标:验证ARPG在相同猜测次数下是否能实现更高破解率。
基线模型:ADaMs模型
两个模型都是拿Rockyou-2009(约1400万唯一单词)中的口令做规则变换,攻击的密码集为:
- Neopets(2700万唯一密码)。
- Cit0day(4000万唯一密码)。
最后比较的是攻击结束时成功猜中的密码占比。
如何实现“更少的规则选择”:为两个模型在两个规则集上设置不同的阈值。因为两个模型输出的都是每个规则出现的概率,只有概率大于阈值的规则才会被选取。
如果要验证在相同猜测次数下是否能实现更高破解率,首先要保证猜测次数近似,即生成的规则数近似,在这里各阈值的选取是:
- ARPG阈值设置:
- PasswordPro规则集:阈值=0.100,选择19.3%的规则。
- Generated规则集:阈值=0.150,选择19.4%的规则。
- ADaMs阈值设置:
- PasswordPro规则集:阈值=0.275,选择20.1%的规则。
- Generated规则集:阈值=0.415,选择19.7%的规则。
ARPG的阈值更小就能选取与ADaMs相似数目的规则数,那说明由ARPG预测出的规则概率中,高概率的比较多
最后在相同的猜测次数下(规则数一样)ARPG的准确率更高,说明其产生的规则更好