密码模式识别工具Passpat:键盘布局分析与密码安全评估

Passpat是一款基于键盘布局分析密码模式的Ruby工具,通过计算按键移动距离评估密码安全性,支持多种键盘布局并已应用于实际密码泄露数据分析。

Passpat - 密码模式识别器

普遍认为,大多数常用密码基于字典单词,但有些人选择使用键盘模式。为了识别这些模式,我创建了Passpat。Passpat使用包含常见键盘布局的数据文件(请提交更多布局),遍历每个单词并根据其接近模式的程度进行评分。目前,“模式"指相邻按键,如qpalzm是一种模式,但识别此类模式目前不在项目范围内。

工作原理

方法相当简单:从第一个字母开始,检查下一个字符。如果在同一键上(如a到A或2到”),得分为0,因为我们没有移动。如果移动一个字符距离(如1到2或a到S),得分为1。重复此过程,检查2个字符距离、3个字符距离等,最多到映射允许的范围。虽然认为超过单步移动价值不大,但应用可以处理任何距离的步骤。如果未找到字符,则添加最大距离(通常为一个字符)加一。这给出了输入单词时在键盘上移动的总距离得分。最后,将得分除以步数(字符数减1),得到单词的平均得分。

  • 得分为0表示密码从未离开单个键,例如aAaaaAAAaaaaaA得分为0
  • 得分为1表示每个字符距离前一个字符仅一步之遥,如asdFDsw"34rfGh
  • 得分为最大值表示每个键都超过一步距离,如aDgp4ma9r

工作示例

我更喜欢示例,这里有一个。以Mac键盘上的密码Ade3#4%U为例[1]。看起来相当随机,有8个字符和混合字符集,但让我们检查它是否是一种模式。我将使用Mac键盘,仅映射单步,这意味着同一键得分为0,相邻键得分为1,任何其他键得分为2。

上一个键 当前键 得分 描述 运行总计
A d 2 超过单键距离,得分为2 2
d e 1 单键距离,得分为1 3
e 3 1 单键距离,得分为1 4
3 # 0 3和#是同一键,得分为0 4
# 4 1 单键距离,得分为1 5
4 % 2 单键距离,得分为1 6
% U 2 超过单键距离,得分为2 8

经过7步,运行总计为8,平均得分为8/7=1.14285714286。这表明看起来相当随机的密码Ade3#4%U实际上几乎是一种键盘模式。

希望这讲得通,基本上该应用计算输入时按键之间的平均移动距离。

安装/使用

该应用在Ruby 1.9中编写和测试,可能不适用于1.8.x,但应适用于2.x。

不需要额外的gem,因此应在纯净的Ruby安装上运行。

使用–help获取完整使用说明:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
./passpat.rb --help
passpat 1.0 Robin Wood (robin@digininja.org) (www.digininja.org)

用法: passpat.rb [OPTIONS] ... PASSWORD_FILE
    --layout x, -l x: 使用指定的布局文件。未设置默认值,因此必须指定
    --list-layouts: 显示可用的布局文件
    --help, -h: 显示帮助
    --verbose, -v: 详细消息

    PASSWORD_FILE: 要检查的密码列表

运行很简单,给它一个布局文件和要分析的密码列表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
./passpat.rb --layout uk pattern_sample.txt 
密码: asdfghjkl
总得分 = 8
移动次数 = 8
模式得分 = 1.0 / 2

密码: apeofmsk
总得分 = 14
移动次数 = 7
模式得分 = 2.0 / 2

密码: aqwsxcdef
总得分 = 8
移动次数 = 8
模式得分 = 1.0 / 2

处理的密码总数: 3
总体模式得分 1.3333333333333333 / 2
找到的零长度总数: 0
找到的一长度总数: 2

下载

Passpat作为Pipal github仓库的一部分发布。

如果不确定如何使用github,只需点击大约中间左侧的ZIP按钮,将获得一个zip文件,可以解压缩并使用,就像下面的版本一样。

分析

我计划对运行过Pipal的一些密码列表运行此工具,以找到平均得分,并将在结果生成后发布。我认为可能会发现从主要通过移动设备使用的站点或应用中获取的转储。由于移动设备输入不便,我认为人们自然会选择模式以使输入容易。

一旦获得更多布局,对相同转储运行不同的布局可能会揭示有趣的结果。

所有这些都已使用UK键盘进行分析。

  • phpBB

    • 处理的密码总数: 184344
    • 总体模式得分 1.7017217768424548 / 2
    • 找到的零长度总数: 285
    • 找到的一长度总数: 3083
  • Hotmail

    • 处理的密码总数: 8930
    • 总体模式得分 1.7343977280864893 / 2
    • 找到的零长度总数: 30
    • 找到的一长度总数: 103
  • LinkedIn

    • 处理的密码总数: 2950516
    • 总体模式得分 1.720141081248872 / 2
    • 找到的零长度总数: 303
    • 找到的一长度总数: 27680

我们需要更多布局

Passpat拥有的键盘布局越多,效果越好,请提交更多。我想看到的布局包括:

  • US
  • Dvorak
  • 澳大利亚
  • 任何非西方键盘,如泰语、日语等

如果有兴趣,请查看layouts/uk.rb中的UK键盘文件,这是完全文档化的良好起点。如果需要任何帮助,请告诉我。

反馈/待办事项

与Pipal一样,初始版本未优化。我希望先获得一个可用的工具,并了解人们喜欢、不喜欢或希望添加的功能。如果想贡献速度改进或新功能,请随时向github仓库提交拉取请求。

我还想添加根据得分对结果排序的功能。问题在于我必须在排序和显示之前在内存中缓存所有结果。对于大型转储,这可能会占用大量内存,这是我想避免的。我会考虑一下。

CSV导出也可能有用,这将允许导入电子表格,以便自行排序和分析结果。

致谢

感谢所有支持Pipal并帮助我完成此工具的人。

感谢BruCON

这是我由BruCON 5x5奖赞助的第二个工具。

[1] 使用此示例是因为我找到了一个很好的图像来说明。

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