2011-06-08 23 views
0

我必须创建一个密码强度检查器,但我无法获得的唯一要求是“不是字典中的单词或专有名称”。我有一个60兆字节的文本文件。例如,当你使用“测试”时,它会失败,但如果你使用test123,它会在失败时通过。密码要求 - 不是字典的单词或专有名称

我该代码是:

int counter = 0; 
string line; 
while ((line = file.ReadLine()) != null) 
{ 
    if (line.Contains(pwd)) { return false; } 
    counter++; 
} 

我将如何分析用户的密码拉了字典中的单词?

或者我应该尝试实施一个正则表达式,迫使每3个字符是一个数字或特殊字符,避免字典文件一起?谢谢。

+3

你还没有定义你想要失败的东西。 'test123'不是词典单词。你不能简单地说“任何包含字典单词的东西”,因为1)没有意义,2)有很常见的短字符串是字典单词,比如'a'。你不想拒绝每个包含'a'的密码 – CodesInChaos 2011-06-08 13:53:14

+1

“Qj16!!!”(注意“中间的”)有效还是无效?我问,因为“test123”不是一个字典词,它只包含一个。真正的要求是什么?密码是否可以包含“a”或“I”? – 2011-06-08 13:54:16

+2

关于你的“或”建议,强制“每个* n *字符是* x *类型”的想法不会让你走上安全之路。首先,你已经公布了关于如何破解它的第一个细节。 – 2011-06-08 13:54:26

回答

1

为什么你不把它放在SQLite中并做简单的查询?

+0

如果这是c#(如标签)linq查询保证可用... sqlite似乎矫枉过正,当你有一个内置的查询语法 – 2011-06-08 14:51:48

0

如果将Word加载到服务器上,则可以使用内部字典进行检查,或使用字典Web服务(如this)查看字典中是否存在单词。如果结果被返回,那么你可以假设它是一个字典单词。

0

我会将这些单词存储在程序开始的列表中,并从那里开始工作。

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; 
} 
1

你真正想要的是计算密码的熵。分析字符的哪个子集或者是否使用了字典单词只是更好地估计熵的工具。

字典单词的问题在于,它们相关的熵通常与它们的长度相比非常低。所以你应该为字典单词添加更少的熵,而不是明显随机的字符。

1

您的代码几乎是您的应用的拒绝服务引擎。将字典导入到SQL数据库,然后使用SQL查询进行匹配。

IF NOT EXISTS (SELECT Word FROM Dictionary WHERE Word LIKE '%' + @Passowrd + '%') 

会做这项工作。

至于其他人提到你似乎试图禁止包含字典中的单词的密码,这是非常愚蠢和混乱为您的用户并没有真正提供附加的安全。你真的应该只是在寻找密码,这是字典词,即测试是坏的,但test123罚款。如果是这样的SQL将更有效:

IF NOT EXISTS (SELECT Word FROM Dictionary WHERE Word = @Passowrd) 
0

你应该真的听安全现在播客#303。密码强度进行了深入讨论。

另见:https://www.grc.com/haystack.htm这应该指向你在正确的方向。

相关问题