键盘模式转密码生成器:Pat to Pass的技术实现与应用

Pat to Pass是一款基于键盘输入模式生成潜在密码的工具,通过分析左右手按键序列和Levenshtein距离算法优化密码猜测效率,支持自定义键盘布局和字典过滤,适用于安全研究和密码强度测试场景。

Pat to Pass

本月的BruCON 5x5项目源于我在发布Passpat后朋友提出的一个想法。Passpat通过分析密码中的键盘模式来识别规律,而Pat to Pass几乎相反——它通过观察按键序列尝试将其转换为潜在密码。当前版本更多是概念验证和示例代码,希望有更擅长处理海量数据的人能将其发展为实用工具。

技术场景与应用

假设你看到某人输入密码:右手、左手、左、左、左、右、左、左,最后是左手数字。密码可能是什么?[1] 将该序列输入Pat to Pass后,它会生成所有可能的密码组合列表。虽然列表极长(11151515151115156 = 8,269,593,750条),但至少提供了起点。

更简单的6字符密码(左右手均匀分布)会生成约450万条更易管理的词表。这些列表可用于离线暴力破解(尤其是弱哈希算法),但若需在线暴力破解或手动攻击,则需进一步缩小范围——此时需引入Levenshtein距离算法。

Levenshtein距离优化

Levenshtein距离指将词1转换为词2所需的最小单字符编辑次数(例如"abc"到"abd"距离为1,“abc"到"def"距离为3)。由于人们常选择接近字典词的密码,通过将主算法生成的随机词与真实词典对比并过滤超出容差的结果,最终列表会大幅缩减且更实用。测试中,我基于"password"的按键序列生成潜在词,仅通过输出即可轻松识别原词。

尽管处理海量数据需大量优化才能完全实用,我仍发布此脚本,因它颇具启发性,期待有人能挑战将其发展为实用工具。

安装与使用

该应用基于Ruby 1.9.x和2.0.x编写测试,需安装额外gem:

1
gem install levenshtein-ffi

安装后运行脚本获取完整指令:

1
./pat_to_pass.rb --help

输出示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Pat to Pass 1.0 Robin Wood (robin@digininja.org) (www.digininja.org)

Usage: pat_to_pass [OPTION] ... PATTERN
        --help, -h: 显示帮助
        --disp-keys: 显示模式选项
        --output, -o: 输出到文件
        --dictionary, -d: Levenshtein测试所用词典
        --lev-distance: Levenshtein距离容差(默认3)
        --recursive: 使用递归算法替代基础循环

        PATTERN: 生成词的按键模式

模式示例:
l,r = 左手后接右手
mr,tl = 中右后接左上
#q,tr,l,l,#1 = 字符q后接右上、左、左和字符1

警告:长模式运行耗时极长(可能数年),请从短模式(4-5字符)开始尝试。

键盘模式定义

模式以引号字符串传递,键盘位置由以下字符定义:

  • l = qwertasdfgzxcvb(左区)
  • tl = qwert(左上)
  • ml = asdfg(左中)
  • bl = zxcvb(左下)
  • r = yuiophjklnm(右区)
  • tr = yuiop(右上)
  • mr = hjkl(右中)
  • br = nm(右下)
  • nl = 123456(左数字)
  • nr = 7890(右数字)

例如,“love"可表示为"r,r,l,l"或更精确的"mr,tr,bl,tl”。越精确的模式生成词越少,运行越快。若观察到具体字符,可用”#“指定(如"l,r,l,#1"代表密码"god1"的末字符)。非英式键盘需修改脚本顶部的映射表。

高级功能

  • Levenshtein检查需通过--dictionary传递词典,容差通过--lev-distance设置(注意:每个生成词都会与词典全词对比,建议使用极简词典)。
  • 默认输出到屏幕,可通过--output重定向到文件。
  • 可选择基础循环或递归算法(两者速度相近,默认即可)。

下载与反馈

下载Pat to Pass 1.0版,或通过GitHub提交补丁。欢迎提交性能优化补丁——我有一些想法但时间有限,若有兴趣可联系讨论。

致谢

Pat to Pass是BruCON 5x5项目赞助工具之一。[1] 文首序列对应全球最常见密码之一:password1。


comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计