Zrobiłem zwykłe wyszukiwania w Google i myślę, że mam rację mówiąc, że nie ma generatora losowych haseł w .NET Framework. Intencją jest zresetowanie haseł w AD dla zapominalskich użytkowników.
To z pewnością będzie problemem na kolejnym etapie testowania penetracji. Chcę uniknąć odpowiedzi "o tak, właśnie zapukałem swoją własną sprawę generatora".
Jakie są rekomendacje? Z pewnością nie mogę polegać na klasie .NET Random i tablicy znaków.
Twoje zdrowie.
Odpowiedzi:
13 dla odpowiedzi nr 1Chociaż powinieneś nie polegać na Random
dla wszystkiego, co dotyczy bezpieczeństwa, powinieneś być w porządku używając RNGCryptoServiceProvider
generować losowe dane potrzebne do budowania nowych haseł.
W rzeczywistości jest metoda w BCL do generowania losowych haseł, ale ukryta w pliku System.Web
montaż. Metoda statyczna Membership.GeneratePassword
potrafi generować hasła o długości określonej przez wywołującego.
Metoda GeneratePassword służy do generowanialosowe hasło i jest najczęściej używane przez metodę ResetPassword zaimplementowaną przez dostawcę członkostwa, aby zresetować hasło użytkownika do nowego, tymczasowego hasła.
Wygenerowane hasło zawiera tylko alfanumeryczneznaki i następujące znaki interpunkcyjne:! @ # $% ^ & * () _- + = [{]};: <> | ./ ?. W generowanym haśle nie ma ukrytych lub niedrukowalnych znaków kontrolnych.
Dokumentacja nie zawiera żadnych informacji dotyczących w jaki sposób hasło jest tworzone, ale kod źródłowy jest dostępny żebyś rzucił okiem.
4 dla odpowiedzi nr 2
Jeśli naprawdę chcesz prawdziwej losowości, powinieneś użyć RNGCryptoServiceProvider klasa zamiast Losowy do takich zadań. Oto przykład jak stworzyć losowe hasło w .NET.
2 dla odpowiedzi nr 3
Jest to funkcja do generowania łatwych do zapamiętania haseł. Może być przydatna do resetowania hasła lub tworzenia początkowych haseł, zamiast proszenia użytkownika o wpisanie go podczas rejestracji.
// Creates fairly easy-to-remember random passwords, consisting of
// three syllables (consonnant + vowel) and two digits at the end.
// A total of 172"800"000 combinations is possible.
public static string GeneratePassword()
{
const string consonnants = "bcdfghjklmnpqrstvwxz";
const string vowels = "aeiouy";
string password = "";
byte[] bytes = new byte[4];
var rnd = new RNGCryptoServiceProvider();
for (int i=0; i<3; i++)
{
rnd.GetNonZeroBytes(bytes);
password += consonnants[bytes[0]*bytes[1] % consonnants.Length];
password += vowels [bytes[2]*bytes[3] % vowels.Length];
}
rnd.GetBytes(bytes);
password += (bytes[0] % 10).ToString() + (bytes[1] % 10).ToString();
return password;
}
Daje to hasła takie jak te:
bavara11
baqovi84
namana07
cyluha55
vobana18
qanabi05
bukinu09
gapupa29
P.S. To prawdopodobnie nie są najbezpieczniejsze hasła na świecie, ale I BET, są one znacznie silniejsze niż średnia z tego, co ludzie używają w Internecie.