Penghasil Kata Sandi "Crapcode"

Sep 27 2020

Saya membuat Password Generator di C #.

Ini meminta pengguna untuk mengetahui panjang kata sandi , apakah itu berisi angka , huruf kecil , huruf besar atau simbol , dan menghasilkan kata sandi yang kuat dari angka, huruf, atau simbol yang ditambahkan secara acak.

Ada kodenya:

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

        }
    }
}

Apakah 221 baris terlalu banyak untuk ini? Bagaimana cara meningkatkannya? Apakah ini "kode omong kosong"? Bagaimana tidak menulis kode omong kosong? ....Terima kasih!

Jawaban

7 radarbob Sep 28 2020 at 10:52

Dari dokumentasi kelas MSDN Random

Untuk membuat nomor acak yang aman secara kriptografik, seperti nomor yang cocok untuk membuat sandi acak, gunakan kelas RNGCryptoServiceProvider atau dapatkan kelas dari System.Security.Cryptography.RandomNumberGenerator.


Random Rand = new Random ();

Edit Koreksi: Menggunakan snapshot dari jam sistem, konstruktor tanpa parameter akhirnya menggunakan nilai seed yang berbeda; kecuali objek Acak dibuat sangat dekat dalam waktu yang waktu jam yang sama digunakan. Diberikan argumen yang sama (nilai benih parameter), Random yang berbeda menghasilkan urutan acak yang sama. akhir Edit

Setiap Randomobjek yang dibuat dengan konstruktor tanpa parameter akan menghasilkan urutan angka acak yang sama karena nilai "benih default" yang sama digunakan setiap saat. Ini sempurna untuk pengembangan dan pengujian tetapi tidak dalam kode produksi. Membaca waktu sistem dalam milidetik adalah cara umum untuk menghasilkan nilai "benih" yang berbeda untuk setiap panggilan konstruktor.


kode crapcode Smell

Keraguan kabur yang Anda miliki tentang kode ini secara teknis disebut "bau kode", yang berarti kode tersebut terlihat mencurigakan karena suatu alasan - panjangnya "terasa" merindukan apa yang dilakukannya, dalam kasus ini. Mungkin ada yang salah, mungkin tidak; "bau kode" membutuhkan penelitian yang lebih cermat untuk menentukan apakah ada yang salah.

Bau kode yang saya lihat adalah beberapa whileloop yang tampak serupa , masing-masing mencari karakter yang diperlukan berbeda. Saya tidak ingin menulis sulit untuk memahami kode demi baris yang lebih sedikit. "Lebih sedikit baris kode" saja bukanlah alasan untuk mengubah banyak hal. Ini idenya, mungkin itu perbaikan atau mungkin tidak:

Beri tahu pengguna karakter yang diperlukan di depan saat meminta kata sandi.

Sebuah string iterable, Anda bisa "forEach". A Stringsebenarnya adalah deretan Char, secara teknis.

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

Periksa setiap karakter untuk tipenya. Buat hitungan terpisah untuk setiap jenis karakter.

Setelah forEachpengujian, setiap penghitung untuk minimum yang dibutuhkan. Jika symbolsnol, misalnya, tambahkan "setidaknya satu karakter simbol diperlukan" ke pesan kesalahan.


FYI

Ada pepatah lama dengan inti kebenaran: Jika Anda menyelesaikan masalah dengan ekspresi reguler, sekarang Anda memiliki dua masalah


Apakah 221 baris terlalu banyak untuk ini

Ada banyak pedoman, prinsip, "isme", dll. Untuk mengevaluasi kualitas kode. Jumlah baris bukan salah satunya.