Passwortgenerator "Crapcode"
Ich habe Password Generator auf C # gemacht.
Es fordert den Benutzer zur Eingabe der Länge des Kennworts auf , unabhängig davon, ob es Zahlen , Kleinbuchstaben , Großbuchstaben oder Symbole enthält , und generiert aus zufällig hinzugefügten Zahlen, Buchstaben oder Symbolen ein sicheres Kennwort.
Da ist der 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);
}
}
}
}
}
Sind 221 Zeilen zu viel dafür? Wie kann man es verbessern? Ist das ein "Crapcode"? Wie schreibe ich keinen Crapcode? ....Vielen Dank!
Antworten
Aus der MSDN Random Class-Dokumentation
Verwenden Sie die RNGCryptoServiceProvider-Klasse oder leiten Sie eine Klasse von System.Security.Cryptography.RandomNumberGenerator ab, um eine kryptografisch sichere Zufallszahl zu generieren, z. B. eine, die zum Erstellen eines zufälligen Kennworts geeignet ist.
Random Rand = new Random ();
Korrektur bearbeiten : Bei Verwendung eines Snapshots der Systemuhr verwendet der Konstruktor ohne Parameter unterschiedliche Startwerte. es sei denn, die zufälligen Objekte werden so zeitnah erstellt, dass dieselbe Uhrzeit verwendet wird. Bei gleichem Argument (Parameter-Startwert) erzeugen verschiedene Zufälle dieselbe Zufallsfolge. Ende Bearbeiten
Jedes
RandomObjekt, das mit dem parameterlosen Konstruktor erstellt wurde, generiert dieselbe Folge von Zufallszahlen, da jedes Mal derselbe "Standard-Startwert" verwendet wird. Dies ist perfekt für die Entwicklung und das Testen, jedoch nicht im Produktionscode. Das Lesen der Systemzeit in Millisekunden ist eine übliche Methode, um für jeden Konstruktoraufruf unterschiedliche "Startwerte" zu generieren.
Crapcode
Code Geruch
Die unscharfen Zweifel, die Sie an dem Code haben, werden technisch als "Codegeruch" bezeichnet, was bedeutet, dass er aus irgendeinem Grund verdächtig aussieht - die Länge "fühlt" sich in diesem Fall länger an für das, was er tut. Möglicherweise stimmt etwas nicht, vielleicht auch nicht. Ein "Code-Geruch" erfordert eine genauere Prüfung, um festzustellen, ob tatsächlich etwas nicht stimmt.
Ein Codegeruch, den ich sehe, sind die mehreren ähnlich aussehenden whileSchleifen, die jeweils nach unterschiedlichen erforderlichen Zeichen suchen. Ich möchte nicht schwer verständlichen Code schreiben, um weniger Zeilen zu erhalten. "Weniger Codezeilen" allein sind kein Grund, Dinge zu ändern. Hier ist eine Idee, vielleicht ist es eine Verbesserung oder vielleicht auch nicht:
Teilen Sie dem Benutzer die erforderlichen Zeichen im Voraus mit, wenn Sie zur Eingabe des Kennworts aufgefordert werden.
Eine Zeichenfolge ist iterierbar, Sie können "forEach". A Stringist in der Tat eine Reihe von Char, technisch.
forEach (char character in enteredPassword) { ... }
Untersuche jedes Zeichen auf seinen Typ. Führen Sie für jeden Zeichentyp eine separate Zählung durch.
Nach dem forEachTest jeder Zähler für das erforderliche Minimum. Wenn symbolsbeispielsweise Null ist, fügen Sie "mindestens ein Symbolzeichen erforderlich" an eine Fehlermeldung an.
Zu Ihrer Information
Es gibt ein altes Sprichwort mit einem Kern der Wahrheit: Wenn Sie ein Problem mit einem regulären Ausdruck lösen, haben Sie jetzt zwei Probleme
Sind 221 Linie zu viel dafür
Es gibt viele Richtlinien, Prinzipien, "Ismen" usw. zur Bewertung der Codequalität. Die Zeilenanzahl ist keine davon.