关于c#:使用for循环生成密码


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(),否则附加到某个字符串并在循环外打印