如何以编程方式创建/检测密码中的键盘运行?

时间:2011-07-12 22:22:04

标签: passwords pattern-matching graph-theory graph-traversal

我正在寻找一种在密码中创建或检测键盘运行列表的方法。

我可以使用密码标准来限制我的问题,例如所需的长度和特殊字符数。

一个简单的密钥运行示例可以是“6yhn ^ YHN”或“zse4ZSE $”。

更复杂的密钥运行可能有不同的形状,如'V'或'X'(例如“mko0mju7MKO)MJU&”)

最初的想法是对大型密码转储进行统计分析,并查看密钥运行密码的普遍性,但我认为它可以在密码强度执行工具中有积极的应用。

3 个答案:

答案 0 :(得分:4)

你不会用正则表达式来做这件事。

您将需要创建一个对键盘建模的图形数据结构,每个键都是一个节点,边缘被指定一个方向(因此节点G将具有方向右和目标H的边缘)。你也可以有一个从一个键到它的移位版本(或从移位到未移位)的边缘。然后,您可以检查密码中的运行,检查它是否按照N字符的一致方向跟随图表。

键盘上有很多可能的运行,所以我不确定由运行组成的密码是不是比其他可能的密码更安全......

答案 1 :(得分:3)

我不知道这与正则表达式有什么关系 - 你认为你能用正则表达式做到这一点吗?我看不出怎么样。

我认为这是一个图形问题,不是吗?构建一个包含键及其邻居之间所有边缘的图形,然后遍历输入并查看它是否表示图形的有效遍历。你的“更复杂的运行”基本上只是回溯 - 如果输入中的下一个键不是图形中的边缘,则返回到开头(或者如果你想覆盖“T”或其他变化,可以逐个回溯) ?)看看你是否可以继续穿越...

对于一个相当模糊的问题,这是一个非常模糊的答案,你不是吗?

答案 2 :(得分:0)

这实际上可能不会那么难。存储一组表示字符的对象,其中包含TL,BR,T,BL(左上,右下,上,左下)等属性,例如:

a = RunKey.get("A");



public class RunKey{

    public static Key get(Character char){
        switch(char){
            case A,a: return new A();
            break;
            // one for every letter
        }
     }
 }

 private class A extends RunKey implements IRunKey{

     public IRunKey BR(){
         return new Z();
     }

     public IRunKey TR(){
         return new W();
     }

     public IRunKey T(){
         return new Q();
     }

     public Direction getDirection(Character char){
         tempRunKey = Runkey.get(char);
         if (tempRunKey.T.toString == "char"){
             return T;
         }
     }
 }

我开始变得疯狂创建一个“方向”界面,所以它比起初稍微复杂,但你只有很多复杂功能和相对简单的对象,所以如果你保持它很轻,那么它可能会保持相当快。

我觉得像这样的动态语言可能是最好的......

是的,正如其他答案所指出的那样,正则表达式不起作用。