使用for循环生成密码

时间:2011-12-15 19:51:53

标签: c#

我正在创建一个生成随机数的密码生成器,然后我使用ascii将其转换为一个字母。在for循环中,我需要字母来转换字符串而不是列表。它可以工作,但它只是将随机字母显示为列表。

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

7 个答案:

答案 0 :(得分:16)

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() );

这不是我如何构建密码,也不是我如何生成随机文本,但这会给你一个字符串并回答原始问题。

关于我 如何执行此任务:

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比更常用的Base64具有优势,因为它不包含任何特殊字符,因此它易于在查询字符串,HTML和JavaScript中使用(有一些小的警告)。当然,密码不应该在任何这些地方使用,并且您可能想要包含特殊字符以使密码更复杂。

无论如何,这是我如何将随机数转换为Base62。

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 :(得分:6)

var sb = new StringBuilder();
for (int i = 0; i < length; i++) {
    sb.Append((char)Number());
}
string password = sb.ToString();
Console.WriteLine(password );

但我会将您的Number()方法更改为:

private static char GetRandomChar()
{
    return (char)_r.Next(65, 90);
}

然后替换循环内的行:

sb.Append(GetRandomChar());

答案 2 :(得分:3)

//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
    }
}

答案 3 :(得分:2)

你可以尝试这个

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

答案 4 :(得分:1)

只需在int x附近定义一个字符串... 喜欢     String Password =“”;

并在if语句中附加了keyyword。

if (length > 0)
{
Console.WriteLine(num);
Password+=num
}

答案 5 :(得分:0)

当我必须创建一个生成随机密码的方法时,我发现以下帖子很有用: https://stackoverflow.com/a/730352/1015289

然而,当我想创建一个简短的验证时间。样式代码将通过电子邮件发送给用户以确认其详细信息,我想将验证代码限制为仅8个字符。

为此,我使用了以下内容:

  

string validationCoce = Guid.NewGuid()。ToString()。Substring(0,8);

这将存储在一个数据库中,该数据库还保存用户的电子邮件,这些数据库在出于安全目的存储之前都已加密。

电子邮件和验证码都需要验证用户帐户。

希望上述任何一种帮助?

亲切的问候,韦恩

答案 6 :(得分:-1)

使用Console.Write()代替Console.WriteLine(),否则附加到某些字符串并在循环外打印