Generate password using a for loop
我正在制作一个生成随机数的密码生成器,然后用ASCII将其转换为字母。在for循环中,我需要字母来转换字符串而不是列表。它可以工作,但它只是将随机字母显示为一个列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; class MainClass { static void Main() { int x = 1; int length; string a ="Press any key to continue"; object num; while (x == 1) { Console.WriteLine("How many Characters would you like the Password to be? (Press -1 to Stop)"); length = Convert.ToInt32(Console.ReadLine()); try { for (int i = 0; i < length; i++) { int num1 = Number(); Int32 ASCII = num1; num = (char)num1; if (length > 0) { Console.WriteLine(num); } } } catch { Console.WriteLine(a); } if (length == -1) break; } } static Random _r = new Random(); static int Number() { return _r.Next(65, 90); // decimal } } |
1 2 3 4 5 6 7 8 9 10 11 12 | StringBuilder sb = new StringBuilder(); for( int i = 0; i < length; i++ ) { int num1 = Number(); Int32 ASCII = num1; num = (char)num1; sb.Append( num ); } Console.WriteLine( sb.ToString() ); |
这不是我如何建立密码,也不是我如何生成随机文本,但这会给你一个字符串并回答最初的问题。
关于我如何完成这项任务:
1 2 3 4 5 6 7 8 | System.Security.Cryptography.RNGCryptoServiceProvider _crypto = new System.Security.Cryptography.RNGCryptoServiceProvider(); byte[] bytes = new byte[8]; // this array can be larger if desired _crypto.GetBytes( bytes ); ulong randomNumber = (ulong)BitConverter.ToInt64( bytes, 0 ); // convert to a string with the encoding of your choice; I prefer Base 62 |
号
为了完整起见,这里是我使用的base62算法。base62的优势在于它不包含任何特殊字符,因此在查询字符串、HTML和JavaScript中使用起来很容易(有一些小的警告)。当然,密码不应该在任何这些地方使用,您可能希望包含特殊字符以使密码更加复杂。
无论如何,下面是我如何将随机数转换为base62。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | private static readonly char[] _base62Characters ="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); public static string ToBase62String( long value ) { if( value < 0L ) { throw new ArgumentException("Number must be zero or greater." ); } if( value == 0 ) { return"0"; } string retVal =""; while( value > 0 ) { retVal = _base62Characters[value % 62] + retVal; value = value / 62; } return retVal; } |
最后,我想指出的是,很少会出于任何目的生成密码,因为这意味着它们是以某种形式分发的。密码应该散列和加盐;密码重置应该依赖于随机的、过期的安全令牌,允许用户一次性重置。密码不应通过电子邮件发送给用户;密码不应以明文或任何可逆格式存储。
对于密码重置令牌的生成,我提供的代码可以很好地工作,因为它产生了一个很大的、加密的随机数字,用Web安全格式编码。但在这种情况下,即使是散列的guid也能做到这一点。
1 2 3 4 5 6 | var sb = new StringBuilder(); for (int i = 0; i < length; i++) { sb.Append((char)Number()); } string password = sb.ToString(); Console.WriteLine(password ); |
。
但是我会把你的number()方法改为:
1 2 3 4 | private static char GetRandomChar() { return (char)_r.Next(65, 90); } |
然后更换回路内的线路:
1 | sb.Append(GetRandomChar()); |
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //You have to append the values generated by the RandomNumber in to your password variable class MainClass { static void Main() { int x = 1; int length; string a ="Press any key to continue"; string num=string.Empty; while (x == 1) { Console.WriteLine("How many Characters would you like the Password to be? (Press -1 to Stop)"); length = Convert.ToInt32(Console.ReadLine()); try { for (int i = 0; i < length; i++) { int num1 = Number(); Int32 ASCII = num1; num =num+ ((char)num1); } Console.WriteLine(num); } catch { Console.WriteLine(a); } if (length == -1) break; } } static Random _r = new Random(); static int Number() { return _r.Next(65, 90); // decimal } } |
你可以试试这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PasswordSample { class Program { static void Main(string[] args) { Console.WriteLine("Generated password: {0}", GeneratePassword(12, true)); } /// <summary> /// Generate a random password /// </summary> /// <param name="pwdLenght">Password lenght</param> /// <param name="nonAlphaNumericChars">Indicates if password will include non alpha-numeric</param> /// <returns>Return a password</returns> private static String GeneratePassword(int pwdLenght, bool nonAlphaNumericChars) { // Allowed characters String allowedChars ="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; if (nonAlphaNumericChars) { // Add non-alphanumeric chars allowedChars +="-&@#%!*$?_"; } char[] passwordChars = new char[pwdLenght]; Random rnd = new Random(); // Generate a random password for (int i = 0; i < pwdLenght; i++) passwordChars[i] = allowedChars[rnd.Next(0, allowedChars.Length)]; return new String(passwordChars); } } } |
。
只需在int x附近定义一个字符串…喜欢字符串密码=";
而在国际单项体育联合会的声明中,这句话就出现在了关键世界。
1 2 3 4 5 | if (length > 0) { Console.WriteLine(num); Password+=num } |
。
当我必须创建一个生成随机密码的方法时,我发现下面的文章很有用:https://stackoverflow.com/a/730352/1015289
但是,当我想创建一个简短的"验证"样式代码,它将通过电子邮件发送给用户以确认其详细信息时,我想将验证代码限制为8个字符。
为此,我使用了以下内容:
string validationCoce = Guid.NewGuid().ToString().Substring(0, 8);
号
这将存储在一个数据库中,该数据库还保存着用户的电子邮件,在出于安全目的而存储之前都进行了加密。
验证用户帐户需要电子邮件和验证代码。
希望上面的任何一个帮助?
亲切的问候,韦恩
使用console.write()而不是console.writeline(),否则附加到某个字符串并在循环外打印