【问题标题】:How to store and search list of 'Banned Passwords'如何存储和搜索“禁止密码”列表
【发布时间】:2013-03-08 06:05:30
【问题描述】:

我正在做一个项目,我需要设置一组密码限制,其中包括一个不允许的密码文件(所有常见密码,如'abc'、'abcdef'、'12345'、'password'等)密码文件将由大约 10000-15000 个单词组成。

现在我想确保当用户设置/更改密码时,列表中不存在该密码。我正在考虑在Java中使用字典(或地图)(桶为'A','B','C'......'Z','NUMBERS','SPECIAL_CHARS'),以便我检查第一个字符,然后搜索相应的桶。但我不确定我能从中获得什么样的表现。

关于使用“禁止密码”列表的任何建议......还有其他需要注意的提示吗?

【问题讨论】:

    标签: java dictionary passwords


    【解决方案1】:

    如果您将“每个字母一个桶”的方法扩展到完整的字符串,您将以 trie 结尾,这看起来像是解决此问题的一个不错的结构,尽管我看不出不使用的原因单个HashSet(毕竟验证成本几乎是恒定的,哈希集在应该存储密码的桶中搜索)。与使用单个集合相比,根据首字母拆分哈希不会提高性能。

    另一方面,如果您的实现是内存受限的,您可以避免存储一些被禁止的密码并进行规则引导的验证(例如,检查是否有 4 个连续的字符相差一个,例如“ghij”,或者检查它们是否是键盘行的片段,例如“yuiop”)。每条规则将相当于几个被禁止的密码。

    【讨论】:

    • 这是我的第一个猜测,但我不确定一个 trie 是否会为此过度杀伤......更多考虑到我必须将整个 trie 存储在内存中。 (或者我错过了什么?)
    • 使用 trie,您可以(理论上)为共享公共前缀的类似字符串(例如 password1password2)节省内存。但后来我意识到每个节点都是一个实例,它包含一个数组/子列表......如果你有许多不同的前缀,它可能需要更多内存。由于密码修改不是一项非常频繁的任务,我认为您可以交换一些处理器周期以减少内存开销。
    【解决方案2】:

    您可能希望使用真正的库来执行此操作。例如..https://code.google.com/p/java-dictionary-password-validator/

    【讨论】:

      【解决方案3】:

      您必须编写一个可以检查字符序列(例如:abcdef)和相同字符(例如:111111)以及所有其他约束的方法。除此之外,您必须采用静态 List/Set 变量来保存所有受限制的字符串。

      【讨论】:

      • 序列和相同的字符也是限制的一部分......但我认为用正则表达式解决这些问题比用字典把它们捆绑起来更容易
      • 这就是我要说的。您必须使用 regx 或循环在方法中处理这些序列和相同的字符串。只有您必须在该静态列表中存储一次受限字符串并使用列表的 contains() 方法进行检查。
      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 2017-05-04
      • 2014-05-30
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多