Generating random password in bulk
我使用此源代码生成随机密码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public string GetRandomPasswordUsingGUID(int length) { // Get the GUID string guidResult = System.Guid.NewGuid().ToString(); // Remove the hyphens guidResult = guidResult.Replace("-", string.Empty); // Make sure length is valid if (length <= 0 || length > guidResult.Length) throw new ArgumentException("Length must be between 1 and" + guidResult.Length); // Return the first length bytes return guidResult.Substring(0, length).ToUpper(); } |
当您调用该方法时,它工作得很好,但不在"for"循环语句中。
在这种情况下,它会生成一些重复的密码,这是错误的。
例如:
1 2 3 4 5 6 7 8 9 10 | A4MNB597D7 AMGJCCC902 AWJ80CF6HX A78EDJECIW A78EDJECIW A78EDJECIW A78EDJECIW A78EDJECIW A2LYJCH23N A2LYJCH23N |
如何在"for"循环语句中创建随机密码?
guid不是随机的,它们只是唯一的(在单个系统中)。即使是一个随机数生成器也有其限制,它将返回的最小值和最大值,真正的随机意味着你可以一次又一次地得到相同的结果,你就是说不出来。
你确定你的意思是随机的,而不是强的?
http://xkcd.com/221/
好吧,现在我们知道你想要500-1000个唯一密码。我会质疑唯一性的必要性,因为我假设它们是为一个用户帐户,然而…(输入时没有使用vs handy)
1 2 3 4 5 6 7 8 9 10 | List<string> passwords = new List<string>(); while (passwords.Length < 1000) { string generated = System.Web.Security.Membership.GeneratePassword( 10, // maximum length 3) // number of non-ASCII characters. if (!passwords.Contains(generated)) passwords.Add(generated); } |
然后您将得到一个1000个唯一密码的列表,最多10个字符,3个非ASCII字符。
这不是问题的具体答案,但这就是您的guid解决方案无法工作的原因:
http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
如果您要在build中生成随机密码,我强烈建议不要使用"newguid()",因为基于用于创建UUID段的生成算法,这些段的时间戳是唯一的~100毫秒。
看:
http://en.wikipedia.org/wiki/universally_unique_标识符
最好创建一个允许字符的查找表,使用静态"随机"对象,并根据生成的随机数将字符索引到表中。
您可以使用ASP.NET的成员类,该类内置密码生成器。它在system.web.security命名空间的system.web dll中。
1 2 | // Generate a new 12-character password with 1 non-alphanumeric character. string password = Membership.GeneratePassword(12, 1); |
有关msdn:membership.generatepassword方法的详细信息,请参阅
具有讽刺意味的是,如果使用guid的最后一个字符而不是第一个字符,那么结果会更好。
要回答您的问题,这样做就足够了:
1 2 3 4 5 6 7 8 9 10 11 12 | private static Random rng=new Random(); private static string PasswordAlphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public string GetRandomPasswordUsingGUID(int length) { string result=""; while(length-->0) result+=PasswordAlphabet[rng.Next(PasswordAlphabet.Length)]; return result; } |