口令猜测—PCFG
PCFG 口令猜测方法介绍
1. PCFG 是什么
PCFG 全称是Probabilistic Context-Free Grammar,即概率上下文无关文法。
在口令猜测研究中,PCFG 的核心思想是:
人类设置口令并不是完全随机的,而是具有明显的结构和习惯。
例如,很多人会使用如下形式的口令:
Password123! summer2024 qwerty123 admin@123这些口令背后通常包含以下组成部分:
- 单词 + 数字
- 单词 + 年份
- 单词 + 数字 + 符号
- 键盘路径 + 数字
- 大小写变化 + 后缀
PCFG 的目标就是从已有的明文口令集中学习这些结构及其概率,然后按照概率从高到低生成候选口令。
2. 一个简单例子
以口令:
Password123!
为例,PCFG 可能会将它拆分为:
Password123!
进一步抽象为:
A8 D3 O1
其中:
- A8 = 8 个字母
- D3 = 3 个数字
- O1 = 1 个其他符号
同时,Password还包含大小写模式:
- password -> 字母内容
- ULLLLLLL -> 大小写模式
- 123 -> 数字内容
- ! -> 符号内容
因此,Password123!的生成概率可以近似表示为:
P(A8D3O1) × P(password | A8) × P(ULLLLLLL | C8) × P(123 | D3) × P(! | O1)PCFG 会优先生成概率更高的组合。
3. PCFG 的训练阶段
PCFG 的训练输入通常是一批明文口令,例如:
123456 password Password123 summer2020 qwerty123训练阶段主要包括以下步骤。
3.1 数据清洗
首先需要对原始数据进行预处理:
- 去除 hash
- 去除用户名、邮箱等非口令字段
- 去除空行
- 过滤异常字符
- 统一编码
- 进行长度限制
训练集通常应当保留重复口令。
例如:
123456 123456 123456 password password qwerty123其中123456出现多次,这说明它是高频弱口令。
这种频率信息对 PCFG 很重要。
3.2 口令结构切分
PCFG 会将每个口令拆分成若干片段。
例如:
- summer2020! -> A6 Y1 O1
- qwerty123 -> K6 D3
- admin@123 -> A5 O1 D3
常见符号含义如下:
- A = Alphabet,字母串
- D = Digit,数字串
- O = Other,特殊符号
- Y = Year,年份
- K = Keyboard walk,键盘路径,例如 qwerty、1qaz
- X = Context-sensitive,上下文敏感片段,例如 #1、;p
- C = Capitalization,大小写模式
- M = Markov / OMEN,字符级兜底模型
3.3 统计基础结构概率
训练程序会统计不同基础结构出现的次数。
例如:
- A6D2 出现 5000 次
- A8D3O1 出现 3000 次
- D6 出现 2000 次
- A5Y1 出现 1500 次
然后将次数转换为概率:
- P(A6D2) = 5000 / 总结构数
- P(A8D3O1) = 3000 / 总结构数
- P(D6) = 2000 / 总结构数
- P(A5Y1) = 1500 / 总结构数
这些基础结构描述了人类口令的整体形状。
3.4 统计片段内部概率
除了统计整体结构,PCFG 还会统计每类片段中具体内容的概率。
例如,在所有 D3 数字片段中:
- 123
- 001
- 520
- 666
- 888
在所有 A8 字母片段中:
- password
- princess
- computer
- iloveyou
在所有 C8 大小写模式中:
- LLLLLLLL
- ULLLLLLL
- UUUUUUUU
因此,PCFG 不仅知道:
A8D3 很常见
还知道:
- A8 中
password很常见 - D3 中
123很常见 - C8 中
LLLLLLLL或ULLLLLLL很常见
3.5 保存规则集
训练完成后,PCFG 会将学习到的概率模型保存为规则集。
在该项目中,规则集通常保存在:
Rules/<RULESET_NAME>/
例如:
Rules/MyRule/
其中包含:
Grammar/grammar.txt # 基础结构概率 Alpha/*.txt # 字母串概率 Digits/*.txt # 数字串概率 Other/*.txt # 特殊符号概率 Capitalization/*.txt # 大小写模式概率 Keyboard/*.txt # 键盘路径概率 Years/*.txt # 年份概率 Context/*.txt # 上下文敏感片段概率 Omen/ # Markov / OMEN 模型4. PCFG 的猜测阶段
训练完成后,PCFG 就可以根据规则集生成候选口令。
猜测阶段的核心目标是:
按照概率从高到低生成候选口令。
4.1 按基础结构排序
假设模型学习到以下结构概率:
- D6 概率最高
- A8
- A6D2
- A8D3
- A8D3O1
那么猜测器会优先考虑这些高概率结构。
4.2 组合具体片段
例如结构:
A8D3
可能生成:
- password123
- princess123
- computer001
- iloveyou520
其中:
- password 来自 A8 字母串
- 123 来自 D3 数字串
如果再加入大小写模式,可能生成:
- password123
- Password123
- PASSWORD123
4.3 候选口令概率计算
以:
Password123
为例,它可能由以下部分组成:
- 基础结构:A8D3
- 字母内容:password
- 大小写模式:ULLLLLLL
- 数字内容:123
其概率可表示为:
P(Password123) = P(A8D3) × P(password | A8) × P(ULLLLLLL | C8) × P(123 | D3)PCFG 会优先输出概率更高的候选口令。
5. PCFG 相比普通字典攻击的优势
普通字典攻击通常只是尝试已有词表:
- password
- 123456
- qwerty
规则攻击可能会做一些简单变换:
- password1
- password123
- password!
PCFG 则会学习更系统的规律:
- 哪些整体结构常见
- 哪些单词常见
- 哪些数字后缀常见
- 哪些符号常见
- 哪些大小写模式常见
- 哪些键盘路径常见
因此,PCFG 能够自然生成类似下面的候选口令:
- Summer2024!
- Password123
- welcome@123
- Qwerty123
它不是简单照搬训练集,而是根据学到的结构和片段进行组合。
6. OMEN / Markov 的作用
传统 PCFG 有一个问题:
如果某个字母串在训练集中从未出现过,PCFG 可能无法生成它。
例如测试集中有:
blueforest2025
如果训练集中没有出现过blueforest,传统 PCFG 很可能无法生成这个候选。
因此,很多 PCFG 系统会结合 Markov 模型或 OMEN 模型作为兜底。
Markov 模型学习的是字符之间的转移概率,例如:
- p -> a
- pa -> s
- pas -> s
- pass -> w
它不依赖完整单词是否出现过,而是学习字符序列是否“像人类口令”。
在该项目中,coverage参数用于控制 PCFG 与 OMEN 的比例:
-c 1.0只使用 PCFG,不使用 Markov / OMEN-c 0.6默认设置,主要使用 PCFG,同时加入一部分 OMEN-c 0.0基本只使用 OMEN
7. PCFG 的经典局限
PCFG 是经典方法,但也有局限。
7.1 依赖训练集
PCFG 的效果高度依赖训练集。
- 如果训练集和目标测试集相似,效果通常较好;
- 如果跨语言、跨地区、跨网站,效果可能明显下降。
7.2 容易受到高频口令影响
如果训练集中存在大量重复弱口令,例如:
- 123456
- password
- qwerty
那么 PCFG 在曲线前段可能表现很好。
但这并不一定说明模型的泛化能力强,因此实验中通常需要同时报告:
- 按样本计的成功率
- 按唯一口令计的成功率
7.3 对复杂语义变换建模较弱
传统 PCFG 对以下变换的建模能力有限:
- password -> p@ssw0rd
- love -> luv
- company name + year + !
- username + birthday
这些更复杂的变换往往需要更强的上下文建模或神经网络模型。
7.4 生成速度相对较慢
PCFG 为了按概率顺序生成候选,需要维护概率排序和组合展开。
因此它通常比 GPU 上的大规模暴力猜测或简单规则攻击更慢。
8. PCFG 的发展方向
PCFG 后续的研究主要围绕“更准确地模拟人类口令生成行为”。
常见改进方向包括:
- 更好的口令分词算法
- 更好的 leetspeak 检测
- 更好的大小写与变形规则建模
- 更好的 Markov / OMEN 混合策略
- 结合用户名、邮箱、网站名等上下文信息
- 结合 RNN、GAN、Transformer 等神经网络模型
- 优化概率排序和候选生成速度
可以将传统 PCFG 理解为一种早期但非常经典的可解释口令生成模型。
它最大的优点是:
每一个候选口令为什么被优先猜测,都是可以解释的。
例如:
为什么先猜Password123?
因为:
- A8D3 这种结构很常见
- password 这个字母串很常见
- ULLLLLLL 这种大小写模式很常见
- 123 这个数字后缀很常见
9. 总结
PCFG 口令猜测方法可以概括为:
训练阶段:
从明文口令集中学习人类口令的结构、片段和概率。猜测阶段:
按照概率从高到低组合这些结构和片段,生成候选口令。核心优势:
比普通字典攻击更能模拟人类设置口令的习惯。核心局限:
依赖训练集,生成速度较慢,对复杂语义变换建模有限。
一句话总结:
PCFG 通过学习“人类口令的结构概率”和“各类片段的出现概率”,按概率顺序生成最可能的人类口令候选。
