Générateur de mots de passe "Crapcode"

Sep 27 2020

J'ai créé Password Generator sur C #.

Il invite l'utilisateur à la longueur du mot de passe , si elle contient des chiffres , des lettres minuscules , des majuscules ou des symboles , et génère un mot de passe à partir des numéros ajoutés au hasard, des lettres ou des symboles.

Voici le code:

using System;

namespace Password_Generator
{
    class Program
    {
        static string Randomize(string Str)
        {
            Random Rand = new Random();

            string Randomized = "";

            while (Randomized.Length < Str.Length)
            {
                Randomized += Str[Rand.Next(0, Str.Length)];
            }

            return Randomized;
        }

        static void Main(string[] args)
        {
            while (true)
            {
                Console.ForegroundColor = ConsoleColor.White;

                Console.Write("\nDo Yout Want a New Password [True], [False]? ");
                Console.ForegroundColor = ConsoleColor.Yellow;
                string NewPasswordStr = Console.ReadLine();
                bool NewPassword;

                while (bool.TryParse(NewPasswordStr, out NewPassword) == false)
                {
                    Console.Clear();

                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("The Given Output is Unconvertable Or it's Value is Unacceptable. Try Again!");

                    Console.ForegroundColor = ConsoleColor.White;
                    Console.Write("\nDo Yout Want a New Password [True], [False]? ");

                    Console.ForegroundColor = ConsoleColor.Yellow;
                    NewPasswordStr = Console.ReadLine();
                    Console.ForegroundColor = ConsoleColor.White;
                }

                Console.ForegroundColor = ConsoleColor.White;

                if (NewPassword == true)
                {
                    Console.Clear();

                    Console.Write("Password Length: ");

                    Console.ForegroundColor = ConsoleColor.Yellow;
                    string LenghtStr = Console.ReadLine();
                    int Lenght;

                    while (int.TryParse(LenghtStr, out Lenght) == false || int.Parse(LenghtStr) <= 0)
                    {
                        Console.Clear();

                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("The Given Output is Unconvertable Or it's Value is Unacceptable. Try Again!");

                        Console.ForegroundColor = ConsoleColor.White;
                        Console.Write("\nPassword Length: ");

                        Console.ForegroundColor = ConsoleColor.Yellow;
                        LenghtStr = Console.ReadLine();
                        Console.ForegroundColor = ConsoleColor.White;
                    }

                    Console.ForegroundColor = ConsoleColor.White;

                    Console.Write("\n\nInclude Numbers (0 - 9) [True], [False]: ");

                    Console.ForegroundColor = ConsoleColor.Yellow;
                    string IncludeNumbersStr = Console.ReadLine();
                    bool IncludeNumbers;

                    while (bool.TryParse(IncludeNumbersStr, out IncludeNumbers) == false)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nThe Given Output is Unconvertable. Try Again!");

                        Console.ForegroundColor = ConsoleColor.White;
                        Console.Write("\nInclude Numbers (0 - 9) [True], [False]: ");

                        Console.ForegroundColor = ConsoleColor.Yellow;
                        IncludeNumbersStr = Console.ReadLine();
                        Console.ForegroundColor = ConsoleColor.White;
                    }

                    Console.Write("\n\nInclude Lowercase Letters (a - z) [True], [False]: ");

                    Console.ForegroundColor = ConsoleColor.Yellow;
                    string IncludeLowercaseStr = Console.ReadLine();
                    bool IncludeLowercase;

                    while (bool.TryParse(IncludeLowercaseStr, out IncludeLowercase) == false)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nThe Given Output is Unconvertable. Try Again!");

                        Console.ForegroundColor = ConsoleColor.White;
                        Console.Write("\nInclude Lowercase Letters (a - z) [True], [False]: ");

                        Console.ForegroundColor = ConsoleColor.Yellow;
                        IncludeLowercaseStr = Console.ReadLine();
                        Console.ForegroundColor = ConsoleColor.White;
                    }

                    Console.ForegroundColor = ConsoleColor.White;

                    Console.Write("\n\nInclude Uppercase Letters (A - Z) [True], [False]: ");

                    Console.ForegroundColor = ConsoleColor.Yellow;
                    string IncludeUppercaseStr = Console.ReadLine();
                    bool IncludeUppercase;

                    while (bool.TryParse(IncludeUppercaseStr, out IncludeUppercase) == false)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nThe Given Output is Unconvertable. Try Again!");

                        Console.ForegroundColor = ConsoleColor.White;
                        Console.Write("\nInclude Uppercase Letters (A - X) [True], [False]: ");

                        Console.ForegroundColor = ConsoleColor.Yellow;
                        IncludeUppercaseStr = Console.ReadLine();
                        Console.ForegroundColor = ConsoleColor.White;
                    }

                    Console.ForegroundColor = ConsoleColor.White;

                    Console.Write("\n\nInclude Symbols [True], [False]: ");
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    string IncludeSymbolsStr = Console.ReadLine();
                    bool IncludeSymbols;

                    while (bool.TryParse(IncludeSymbolsStr, out IncludeSymbols) == false)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nThe Given Output is Unconvertable. Try Again!");

                        Console.ForegroundColor = ConsoleColor.White;
                        Console.Write("\nInclude Symbols [True], [False]: ");

                        Console.ForegroundColor = ConsoleColor.Yellow;
                        IncludeSymbolsStr = Console.ReadLine();
                        Console.ForegroundColor = ConsoleColor.White;
                    }

                    Console.ForegroundColor = ConsoleColor.White;

                    string Password = "";

                    while (Password.Length < Lenght)
                    {
                        Random Rand = new Random();

                        if (IncludeNumbers == true)
                        {
                            Password += ((char)Rand.Next(48, 58)).ToString();
                        }

                        if (Password.Length == Lenght)
                        {
                            break;
                        }

                        if (IncludeLowercase == true)
                        {
                            Password += ((char)Rand.Next(97, 123)).ToString();
                        }

                        if (Password.Length == Lenght)
                        {
                            break;
                        }

                        if (IncludeUppercase == true)
                        {
                            Password += ((char)Rand.Next(97, 123)).ToString().ToUpper();
                        }

                        if (Password.Length == Lenght)
                        {
                            break;
                        }

                        if (IncludeSymbols == true)
                        {
                            Password += ((char)Rand.Next(33, 48)).ToString().ToUpper();
                        }

                        if (Password.Length == Lenght)
                        {
                            break;
                        }
                    }

                    Password = Randomize(Password);

                    Console.WriteLine();

                    Console.ForegroundColor = ConsoleColor.DarkGreen;
                    Console.WriteLine(Password);
                    Console.ForegroundColor = ConsoleColor.White;
                }

                else
                {
                    Environment.Exit(-1);
                }
            }

        }
    }
}

Est-ce que 221 lignes sont trop pour cela? Comment l'empêcher? Est-ce un "crapcode"? Comment ne pas écrire du crapcode? ....Merci!

Réponses

7 radarbob Sep 28 2020 at 10:52

À partir de la documentation de la classe MSDN Random

Pour générer un nombre aléatoire sécurisé par cryptographie, tel que celui qui convient à la création d'un mot de passe aléatoire, utilisez la classe RNGCryptoServiceProvider ou dérivez une classe de System.Security.Cryptography.RandomNumberGenerator.


Random Rand = nouveau Random ();

Correction d' édition : En utilisant un instantané de l'horloge système, le constructeur sans paramètre finit par utiliser différentes valeurs de départ; sauf si les objets Random sont créés si proches dans le temps que la même heure d'horloge est utilisée. Étant donné le même argument (valeur de départ du paramètre), différents aléas génèrent la même séquence aléatoire. fin Modifier

Chaque Randomobjet créé avec le constructeur sans paramètre générera la même séquence de nombres aléatoires car la même valeur «par défaut» est utilisée à chaque fois. C'est parfait pour le développement et les tests, mais pas dans le code de production. La lecture de l'heure système en millisecondes est un moyen courant de générer différentes valeurs «d'amorçage» pour chaque appel de constructeur.


odeur de code crapcode

Les doutes flous que vous avez sur le code sont techniquement appelés «odeur de code», ce qui signifie qu'il semble suspect pour une raison quelconque - la longueur «semble» vouloir ce qu'elle fait, dans ce cas. Il y a peut-être quelque chose qui ne va pas, peut-être pas; une "odeur de code" nécessite un examen plus approfondi pour déterminer si quelque chose ne va pas.

Une odeur de code que je vois est les multiples whileboucles similaires , chacune recherchant différents caractères requis. Je ne veux pas écrire du code difficile à comprendre pour réduire le nombre de lignes. «Moins de lignes de code» à lui seul n'est pas une raison pour changer les choses. Voici une idée, c'est peut-être une amélioration ou peut-être pas:

Indiquez à l'utilisateur les caractères requis à l'avance lors de la demande de mot de passe.

Une chaîne est itérable, vous pouvez "forEach". A Stringest en fait un tableau de Char, techniquement.

forEach (char character in enteredPassword) { ... }

Examinez chaque caractère pour son type. Gardez un compte séparé pour chaque type de caractère.

Après le forEachtest, chaque compteur pour le minimum requis. Si symbolsest égal à zéro, par exemple, ajoutez «au moins un caractère de symbole est requis» à un message d'erreur.


FYI

Il y a un vieux dicton avec un noyau de vérité: si vous résolvez un problème avec une expression régulière, vous avez maintenant deux problèmes


Sont 221 lignes de trop pour cela

Il existe de nombreuses directives, principes, «ismes», etc. pour évaluer la qualité du code. Le nombre de lignes n'en fait pas partie.