我必须创建一个密码强度检查器,我无法满足的唯一要求是“不是字典单词或专有名称”。我有一个 60MB 的文本文件,其中包含大量单词。例如,当您使用“test”时,它会正确失败,但如果您使用 test123,它会在应该失败时通过。
我的代码是:
int counter = 0;
string line;
while ((line = file.ReadLine()) != null)
{
if (line.Contains(pwd)) { return false; }
counter++;
}
我如何解析用户的密码以提取字典单词?
或者我应该尝试实现一个正则表达式来强制每个第三个字符都是数字或特殊字符并完全避免字典文件?谢谢。
您的代码实际上是您应用程序的拒绝服务引擎。将字典导入 SQL 数据库,然后使用 SQL 查询进行单词匹配。
IF NOT EXISTS (SELECT Word FROM Dictionary WHERE @Password LIKE '%' + Word + '%')
会完成这项工作。
正如其他人提到的,您似乎试图禁止包含字典单词的密码,这对于您的用户来说非常愚蠢和令人困惑,并且并没有真正提供额外的安全性。你真的应该只寻找字典单词的密码,即 test 很糟糕,但 test123 很好。如果是这样,SQL 将会更加高效:
IF NOT EXISTS (SELECT Word FROM Dictionary WHERE Word = @Passowrd)
为什么不将其放入 SQLite 中并执行简单的查询?
你真正想要的是计算密码的熵。分析哪个字符子集或者是否使用字典单词只是更好地估计熵的工具。
字典单词的问题在于,与它们的长度相比,它们的相关熵通常非常低。因此,您应该为字典单词添加比明显随机字符更少的熵。
如果 Word 已加载到您的服务器上,那么您可以使用内部词典进行检查,或使用像 this 这样的词典网络服务来查看词典中是否存在某个单词。如果返回结果,那么你可以假设它是一个字典单词。
我会将单词存储到程序启动时的列表中,并从那里开始工作。
List<String> words = new List<String>();
while (!file.EndOfStream)
{
line = file.ReadLine();
words.AddRange(line.split(","); //assuming a csv file.
}
bool passWordCheck()
{
foreach(string x in words)
{
if (passWord.contains(x))
return false;
}
return true;
}
您真的应该听一下 Security Now 播客第 303 集。密码强度受到广泛讨论。
另请参阅:https://www.grc.com/haystack.htm这应该为您指明正确的方向。