2009-10-14 35 views
1

我有一个项目在工作中,我需要将密码与一个项目相关联。
密码应该是完全非顺序的或容易猜测的,但要记住。(.NET)简单的方法来生成随机的,易于记忆的密码

我想过要做这样的事情。

string rand = System.Guid.NewGuid().ToString(); 
rand.Substring(0,3); 

返回GUID的前4位数字。

我想知道是否有其他人有类似的工作,并可能比这更好的解决方案。因为我们不希望人们能够猜测的数字,然而,这并不涉及金钱或个人资料,以便它并没有被NSA能够:)

感谢

安全是非常重要的伙计们!

+0

您在整个问题中都提到了数字。我们是否仅限于数字,因为对于很多人来说没有容易记住数字的事情。 – 2009-10-14 04:23:14

+0

不限于数字 – 2009-10-14 04:48:47

回答

3

如果你想的PIN风格的代码,我建议使用所有的数字(也可能是所有字母),而不是一个GUID的前四个字符。许多人都熟悉全码数字密码。我怀疑有一封混在里面的信可能会让他们不那么容易记住。但我没有证据支持这一点!

如果PIN是足够的,你可以只调用Random.Next(0,9)四次,将结果连接。一定要消除“不够随机”的结果,比如当所有四位数都相同时!正如未知的说法,你可以从密码类获得统计上更多的随机结果,但超过四位数字不太可能成为问题。

+0

同意,添加,随机性非常依赖种子。使用种子的好方法,Random.Next()不会遵循一种模式。我学会了使用DateTime.Now.Millisecond作为证明是致命的种子的教训。 – 2009-10-14 04:59:15

1

你的密码有什么特性?如果你的主要标准是记性,那么我建议是这样的:

去找个大的语料库的英语文本,并获得五个或更少的字母所有唯一的话出来。现在,对于任何特定的新密码,请随机选择其中的三个或四个。然后,在最后,添加一个随机的两位数字。

有多少个密码?那么,对于两位数的数字,一百(密码中随机词的数量)的次数(不同单词的数量)。所以,如果你记下这个密码的基数 - 两个记录,那么你会得到你在这些密码中有可能的熵 - 如果你的随机数发生器足够好的话。

在实践中,如果一些错误的密码尝试后锁定帐户,那么你只要有效地至少有几千个可能的密码挫败攻击。

0

我认为实现它非常困难。

3

如果你想要的东西,将为您的用户提供的东西是相对容易记住,您可以随时使用我的PronouncablePasswords类。

我最初写这个作为一个实验,用于生成可供最终用户发音的随机密码,而不是完整的gobbledygook。当然,这会降低密码的安全性,但出于您的目的,这听起来像是足够的。

该功能只是在元音和辅音之间交替(带有一些基本的例外规则),并根据它们在英语中的出现情况对所选择的字母进行“加权”。请注意,这绝不是完美的,但它确实会“在锡上说些什么”!

代码:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace PronouncablePasswords 
{ 
    class PasswordGenerator 
    { 
     //string vowels = "aeiou"; 
     //string consonants = "bcdfghjklmnprstvwxyz"; 

     /* 
      The reason for the duplicate letters is to add "weighting" to certain letters to allow them more chance 
      of being randomly selected. This is due to the fact that certain letters in the English language are more 
      frequently used than others. 

      The breakdown of usage is as follows (from most frequent to least frequent): 
      1. E     (7) 
      2. T     (6) 
      3. A, O, N, R, I, S (5) 
      4. H     (4) 
      5. D, L, F, C, M, U (3) 
      6. G, Y, P, W, B  (2) 
      7. V, K, X, J, Q, Z (1) 
     */ 

     string vowels = "aaaaaeeeeeeeiiiiiooooouuu"; 
     string consonants = "bbcccdddfffgghhhhjklllmmmnnnnnpprrrrrsssssttttttvwwxyyz"; 

     string[] vowelafter = {"th", "ch", "sh", "qu"}; 
     string[] consonantafter = { "oo", "ee" }; 
     Random rnd = new Random(); 

     public string GeneratePassword(int length) 
     { 
      string pass = ""; 
      bool isvowel = false; 

      for (int i = 0; i < length; i++) 
      { 
       if (isvowel) 
       { 
        if (rnd.Next(0, 5) == 0 && i<(length-1)) 
        { 
         pass += consonantafter[rnd.Next(0, consonantafter.Length)]; 
        } 
        else 
        { 
         pass += vowels.Substring(rnd.Next(0, vowels.Length), 1); 
        } 
       } 
       else 
       { 
        if (rnd.Next(0, 5) == 0 && i<(length-1)) 
        { 
         pass += vowelafter[rnd.Next(0, vowelafter.Length)]; 
        } 
        else 
        { 
         pass += consonants.Substring(rnd.Next(0, consonants.Length), 1); 
        } 
       } 
       isvowel = !isvowel; 
      } 
      return pass; 
     } 
    } 
} 
+0

这真是太棒了!将其推广到加权随机正则表达式需要什么? – Ian 2010-08-17 10:23:05

5

人们记得的话比他们还记得代码...

http://imgs.xkcd.com/comics/password_strength.png

因此,一个简单的办法就是生成一个密码,而不是乱码字或代码。

最简单的方法是在数据库或字典中包含几千个单词的列表,然后随机选择其中的3个或4个。

您使用的词越多,黑客就越难猜出 - 3,000个词中的3个将会很难测,而20,000个词中的4个将会有1,600,000,000,000,000,000个组合。