如何按照以下标准生成密码

时间:2018-10-03 10:49:09

标签: c#

我想根据以下标准生成密码。 一个大写字母 10个小写字母 最后四个数字 我有密码

 //Gnerating a random password
        string allowedChars = "";

        allowedChars = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,";

        allowedChars += "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,";

        allowedChars += "1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,&,?";

        char[] sep = { ',' };

        string[] arr = allowedChars.Split(sep);

        string passwordString = "";

        string tempString = "";
        int PasswordLength = 16;

        Random rand = new Random();

        for (int i = 0; i < Convert.ToInt32(PasswordLength); i++)

        {

            tempString = arr[rand.Next(0, arr.Length)];

            passwordString += tempString;

        }

3 个答案:

答案 0 :(得分:0)

您需要通过以下方式在密码字符串中添加其他字符:

    string lowerChars = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,";
    string[] lowerCharsArr = lowerChars.Split(sep);
    string upperChars = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,";
    string[] upperCharsArr = upperChars.Split(sep);
    string numbers = "1,2,3,4,5,6,7,8,9,0";
    string[] numbersArr = numbers.Split(sep);
    string others = "!,@,#,$,%,&,?";
    string[] othersArr = others.Split(sep);


    string passwordString = "";

    int PasswordLength = 16;

    Random rand = new Random();

    passwordString += upperChars[rand.Next(0, upperChars.Length)];

    for (int i = 1; i < Convert.ToInt32(PasswordLength -4); i++)
    {
        passwordString += lowerChars[rand.Next(0, lowerChars.Length)];
    }
    for (int i = 0; i < 4; i++)
    {
        passwordString += numbersArr[rand.Next(0, numbersArr.Length)];
    }

答案 1 :(得分:0)

不需要同时创建上限值和下限值。我们有用于更改大小写的代码。您还可以将实际选择的内容提取到单独的方法中,这将使测试更加容易。

这是我的尝试:

void Main()
{
    char[] lowerCase = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    char[] numbers = new char[] {'0','1','2','3','4','5','6','7','8','9'};
    // Create the Random outside the method to avoid reseeding
    Random random = new Random();
    // Pick one char and make it uppercase
    string password = PickRandomValueFromValueSet(1, lowerCase, random).ToUpper();
    // Pick 10 lowercase chars
    password+= PickRandomValueFromValueSet(10, lowerCase, random);
    // Pick 4 digits
    password+= PickRandomValueFromValueSet(4, numbers, random);
    Console.Out.WriteLine.(password);
}

string PickRandomValueFromValueSet(int number, char[] valueSet, Random random)
{
    string result = "";
    for (int i = 0; i < number; i++)
    {
        result += valueSet[random.Next(0, valueSet.Length)];
    }
    return result;
}

我不明白为什么!@#$%&?被允许作为问题中的数字。我已经省略了。

答案 2 :(得分:0)

这是您可以执行此操作的一种方法,可以选择使用扩展方法.Shuffle对结果进行混排,但是如果您真的想先保留高位,然后是低位,然后最后保留4位数字/符号,忽略它。

namespace PasswordGen
{
    public class Program
    {
        private static Random _random = new Random();

        static void Main(string[] args)
        {
            var nonAlphaSymbols = "1234567890!@#$%&?";
            var password = new[] { (char)_random.Next('A', 'Z' + 1) } // upper case character
                .Concat(Enumerable.Range(0, 10).Select(a => (char)_random.Next('a', 'z' + 1)) // 10 lower case
                .Concat(Enumerable.Range(0, 4).Select(a => nonAlphaSymbols[_random.Next(0, nonAlphaSymbols.Length)]))) // 4 from nonAlpha
                .Shuffle(); // optional, if you want to shuffle the outcome

            Console.WriteLine(new string(password.ToArray()));
        }

    }

    public static class Extensions
    {   
        private static Random _random = new Random();

        public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> input)
        {
            List<T> output = new List<T>(input);
            for (int i = 0; i < output.Count; i++)
            {
                var swapTarget = _random.Next(i, output.Count - 1);
                T temp = output[swapTarget];
                output[swapTarget] = output[i];
                output[i] = temp;
            }
            return output;
        }
    }
}

示例:https://dotnetfiddle.net/BLOEgy