代码之家  ›  专栏  ›  技术社区  ›  Marcel Chastain

用于键盘混搭的regex

  •  5
  • Marcel Chastain  · 技术社区  · 15 年前

    当注册新帐户时,网络应用程序通常会要求回答“安全问题”,即狗的名字等。

    我想浏览一下我们的数据库,寻找用户只是将键盘捣碎而不是提供合法答案的实例——这是滥用/欺诈帐户的高指标。

    “母亲的娘家姓?” LAKDSJFLKAJ

    关于我该怎么做有什么建议吗?

    注意:我不仅仅在这些“安全问题答案”上使用正则表达式。

    答案可以是:

    1. 使用一些基本的SQL正则表达式从数据库中选择

    2. 根据需要使用python regex进行多次分析

    3. 根据需要进行比较/修剪/评分

    这是一个技术问题,不是哲学问题 ;-)

    谢谢!

    11 回复  |  直到 8 年前
        1
  •  5
  •   itsadok    15 年前

    你最好分析n-gram分布,类似于语言检测。

    This code 是使用三角函数进行语言检测的示例。我猜键盘粉碎三角是相当独特的,不出现在正常语言。

        2
  •  39
  •   tanascius    12 年前

    我不会这样做——在我看来,这些问题会削弱安全性,所以作为一个用户,我总是试图提供另一个半密码作为答案——对于您来说,它就像是混在一起。嗯,它是捣碎的,但这正是我想做的。

    顺便说一句,我不确定你是否可以查询答案。因为它们克服了您的密码保护,所以应该像密码=存储为哈希一样处理它们!

    编辑:
    当我阅读 this article 我立刻想起了这个问题;—)

        3
  •  12
  •   nik    15 年前

    安全问题的整个方法都有很大的缺陷。

    我总能找到 人们的安全答案比他们使用的密码弱 .
    安全问题只是安全链中的一个环节——较弱的环节!

    在我看来,最好的办法是 允许用户请求发送到其注册电子邮件ID的新密码 . 这有两个优点。

    1. 蛮力的尝试必须先找到并破坏电子邮件服务(而且,你永远不会帮助他们——保持注册电子邮件ID的安全性)
      • 当有人试图使用暴力时,您的服务用户总是会得到一个指示(他们收到一封邮件,说他们试图重新生成密码)。

    如果您必须有秘密问题,让他们触发一个重新生成的(不要发送用户的密码,重新生成一个临时的,最好是一次性强制的)密码发送到他们注册的电子邮件ID——并且,不要显示这一点。

    另一个技巧是 使机密问题本身成为其注册的电子邮件ID .
    如果他们说对了,你就发送一个 重新生成的 该电子邮件ID的临时密码。

        4
  •  6
  •   balpha    15 年前

    用正则表达式是不可能做到这一点的。实际上,我想不出一个合理的方法来做到这一点——你会在哪里划出可疑和不可疑的界限?我常常用一个模糊的答案回答安全问题。毕竟,我母亲的娘家姓不是最难知道的。

        5
  •  4
  •   Tim Sylvester    15 年前

    如果你能找到一个英文字母对概率列表,你可以用不在列表中的最不可能的对和对构造一个非“真”英文单词的近似概率。不幸的是,如果你有名字或其他“非单词”,那么你不能强迫他们成为英语单词。

        6
  •  4
  •   Geo    15 年前

    也许你可以检查一下辅音是否丰富。例如,在您的示例中 lakdsjflkaj 有2个元音(A)和9个辅音。通常,随机按一个键击中一个元音的概率要比击中一个辅音的概率低得多。

        7
  •  3
  •   Nate Sullivan    8 年前

    Dejunk 是一个红宝石库,你可以从中获得灵感。它在其他答案中实现了一些建议。如果输入:

    • 包含不太可能出现在真实文本中,但在键盘上却紧密相连的字符双字符。(图书馆里有一张这样的大图。)
    • 以意外的标点符号开始。
    • 有太多的非常短的词。
    • 没有元音。
    • 具有重复次数不合理的字符。
        8
  •  2
  •   Question Mark    15 年前

    你可以在一开始就查一个大写字母…这肯定会给你带来一些误报。

    一个快速的谷歌给了我 this ,您可以将每个名称与该列表中的名称进行比较。

    显然,只适用于你所说的安全问题。

    您是否也看到了:

    Anatomy of the twitter attack

    下次执行安全问题时,我会认真考虑。

        9
  •  2
  •   Alex S    15 年前

    如果你的问题涉及到一个真实的人名,这是不可能的。考虑一下用罗马字符输入的亚洲名称;它们可能会很好地过滤掉你提出的任何过滤器,但仍然是完全合法的。

        10
  •  0
  •   foobarfuzzbizz    15 年前

    你可以寻找语音上没有意义的模式。例如:

    “q”后面不是“u”。

    阿斯达夫

    QWER

    ZXCV

    ASDLASD

    基本上,尝试在你自己的键盘上混搭,看看你得到了什么,然后把它插入你的过滤器。还可以插入各种语法规则。但是,因为你要处理的是名字,你总是会得到一个奇怪的名字,这个名字会导致假阳性。

        11
  •  0
  •   Kevin    15 年前

    与正则表达式不同,为什么不直接与已知良好值的列表进行比较呢?例如,将母亲的婚前姓与人口普查数据进行比较,或者将宠物名与您可以在网上找到的任何宠物名列表进行比较。对于更简单的版本,只需在谷歌上搜索输入的内容。合法名称应该有大量的结果,而键盘混搭应该会导致很少的结果(如果有的话)。

    和其他方法一样,您仍然需要处理误报。

    推荐文章