Generatore di password "Crapcode"
Ho creato Password Generator su C #.
Richiede all'utente la lunghezza della password , indipendentemente dal fatto che contenga numeri , lettere minuscole , lettere maiuscole o simboli , e genera una password complessa da numeri, lettere o simboli aggiunti casualmente.
C'è il codice:
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);
}
}
}
}
}
La riga 221 è troppo per questo? Come introdurlo? È un "crapcode"? Come non scrivere crapcode? ....Grazie!
Risposte
Dalla documentazione di MSDN Random class
Per generare un numero casuale crittograficamente sicuro, ad esempio uno adatto per la creazione di una password casuale, utilizzare la classe RNGCryptoServiceProvider o derivare una classe da System.Security.Cryptography.RandomNumberGenerator.
Rand casuale = nuovo casuale ();
Correzione della modifica : utilizzando un'istantanea dell'orologio di sistema, il costruttore senza parametri finisce per utilizzare valori iniziali diversi; a meno che gli oggetti Random non vengano creati così vicini nel tempo che viene utilizzata la stessa ora dell'orologio. Dato lo stesso argomento (valore seed del parametro), Random differenti generano la stessa sequenza casuale. fine Modifica
Ogni
Randomoggetto creato con il costruttore senza parametri genererà la stessa sequenza di numeri casuali perché ogni volta viene utilizzato lo stesso valore "seme predefinito". Questo è perfetto per lo sviluppo e il test ma non nel codice di produzione. La lettura dell'ora di sistema in millisecondi è un modo comune per generare diversi valori "seed" per ogni chiamata al costruttore.
crapcode
Code Smell
I dubbi confusi che hai sul codice sono tecnicamente chiamati "odore di codice", il che significa che sembra sospetto per qualche motivo - la lunghezza "sembra" troppo lunga per quello che sta facendo, in questo caso. Potrebbe esserci qualcosa che non va, forse no; un "odore di codice" richiede un esame più attento per determinare se qualcosa è effettivamente sbagliato.
Un odore di codice che vedo sono i molteplici whileloop simili , ognuno alla ricerca di caratteri richiesti diversi. Non voglio scrivere codice difficile da comprendere per il bene di meno righe. "Meno righe di codice" da solo non è un motivo per cambiare le cose. Ecco un'idea, forse è un miglioramento o forse no:
Comunicare all'utente i caratteri richiesti in anticipo quando viene richiesta la password.
Una stringa è iterabile, puoi "forEach". A Stringè infatti un array di Char, tecnicamente.
forEach (char character in enteredPassword) { ... }
Esamina ogni carattere per il suo tipo. Tieni un conteggio separato per ogni tipo di carattere.
Dopo il forEachtest ogni contatore per il minimo richiesto. Se symbolsè zero, ad esempio, aggiungere "è richiesto almeno un carattere simbolo" a un messaggio di errore.
Cordiali saluti
C'è un vecchio detto con un nucleo di verità: se risolvi un problema con un'espressione regolare, ora hai due problemi
La riga 221 è troppo per questo
Esistono molte linee guida, principi, "ismi", ecc. Per valutare la qualità del codice. Il conteggio delle righe non è uno di questi.