Gdy użytkownik naszej witryny utraci hasło i przejdzie na stronę Utracone hasło, musimy mu dać nowe hasło tymczasowe. Nie mam nic przeciwko temu, jak losowa jest ta sytuacja, lub jeśli pasuje do wszystkich „potrzebnych” silnych reguł haseł, wszystko, co chcę zrobić, to dać im hasło, które mogą zmienić później.
Aplikacja to aplikacja internetowa napisana w języku C #. więc myślałem o byciu wrednym i podążaniu łatwą drogą korzystania z części Guida. to znaczy
Guid.NewGuid().ToString("d").Substring(1,8)
Suggesstions? myśli?
Odpowiedzi:
Zawsze
System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters
) .źródło
ASP.NET Core
?Ma to tę zaletę, że można wybrać z listy dostępnych znaków dla wygenerowanego hasła (np. Tylko cyfry, tylko wielkie lub tylko małe litery itp.)
źródło
Random
nie jest kryptograficznie bezpieczny;System.Security.Cryptography.RNGCryptoServiceProvider
jest lepszym wyborem.Głównymi celami mojego kodu są:
Pierwszą właściwość uzyskuje się, biorąc 64-bitową wartość modulo wielkości alfabetu. W przypadku małych alfabetów (takich jak 62 znaki z pytania) prowadzi to do nieznacznego błędu. Drugą i trzecią właściwość uzyskuje się za pomocą
RNGCryptoServiceProvider
zamiastSystem.Random
.(To jest kopia mojej odpowiedzi na Jak wygenerować losowy ciąg 8 znaków alfanumerycznych w C #? )
źródło
(Możesz również mieć klasę, w której żyje ta metoda, zaimplementować IDisposable, przechowywać odniesienie do
RNGCryptoServiceProvider
i usuwać je odpowiednio, aby uniknąć wielokrotnego tworzenia instancji.)Zauważono, że ponieważ zwraca łańcuch 64, długość wyjściowa jest zawsze wielokrotnością 4, a dodatkowe spacje są używane
=
jako znak dopełniający.length
Parametr określa długość bufora bajtów, a nie ciąg wyjściowy (iw związku z tym może nie najlepsza nazwa dla tego parametru, teraz myślę o tym). Kontroluje to, ile bajtów entropii będzie miało hasło. Ponieważ jednak base-64 używa 4-znakowego bloku do kodowania każdego 3 bajtu danych wejściowych, jeśli poprosisz o długość, która nie jest wielokrotnością liczby 3, pojawi się dodatkowe „spacja” i użyje=
do wypełnienia dodatkowy.Jeśli nie lubisz używać ciągów base-64 z jakiegokolwiek powodu, możesz zastąpić
Convert.ToBase64String()
wywołanie konwersją na ciąg zwykły lub dowolną zEncoding
metod; na przykład.Encoding.UTF8.GetString(tokenBuffer)
- po prostu upewnij się, że wybierasz zestaw znaków, który może reprezentować pełny zakres wartości wychodzących z RNG, i który produkuje znaki, które są kompatybilne z każdym miejscem, w którym je wysyłasz lub przechowujesz. Na przykład użycie Unicode daje dużo chińskich znaków. Korzystanie z base-64 gwarantuje szeroki kompatybilny zestaw znaków, a charakterystyka takiego łańcucha nie powinna sprawiać, że będzie mniej bezpieczny, pod warunkiem, że użyjesz porządnego algorytmu haszującego.źródło
Jest o wiele większy, ale myślę, że wygląda nieco bardziej kompleksowo: http://www.obviex.com/Samples/Password.aspx
źródło
Wiem, że to stary wątek, ale mam coś, co może być dość prostym rozwiązaniem dla kogoś. Łatwy do wdrożenia, łatwy do zrozumienia i łatwy do sprawdzenia.
Rozważ następujące wymaganie:
Poniższe wyrażenie regularne może sprawdzić poprawność tego przypadku:
To jest poza zakresem tego pytania - ale regex jest oparty na lookahead / lookbehind i lookaround .
Poniższy kod utworzy losowy zestaw znaków spełniających to wymaganie:
Aby spełnić powyższe wymagania, wystarczy wywołać następujące:
Kod zaczyna się od niepoprawnego znaku (
"!"
) - dzięki czemu łańcuch ma długość, do której można wstawiać nowe znaki.Następnie zapętla od 1 do wymaganej liczby małych liter, a przy każdej iteracji pobiera losowy element z listy małych liter i wstrzykuje go w losowe miejsce w ciągu.
Następnie powtarza pętlę dla wielkich liter i cyfr.
To daje ci ciągi znaków = długość,
lowercase + uppercase + numerics
w której małe, wielkie i liczbowe znaki liczby, które chcesz, zostały umieszczone w losowej kolejności.źródło
System.Random
do krytycznych elementów bezpieczeństwa, takich jak hasła. UżyjRNGCryptoServiceProvider
lowers[random.Next(lowers.Length - 1)].ToString()
Ten kod nigdy nie wygeneruje „z”. random.Next generuje liczby całkowite mniejsze niż podana liczba, więc nie należy odejmować tej dodatkowej od długości.Do tego rodzaju hasła używam systemu, który prawdopodobnie generuje łatwiej „używane” hasła. Krótkie, często złożone z wymawianych fragmentów i kilku liczb, bez dwuznaczności między znakami (czy to 0 lub O? A 1 lub I?). Coś jak
(Wpisane bezpośrednio w przeglądarce, więc używaj tylko jako wskazówek. Dodaj też więcej słów).
źródło
Nie podoba mi się hasło, które tworzy Membership.GeneratePassword (), ponieważ są zbyt brzydkie i mają zbyt wiele znaków specjalnych.
Ten kod generuje 10-cyfrowe niezbyt brzydkie hasło.
Jasne, mógłbym użyć Regex, aby wykonać wszystkie zamiany, ale jest to bardziej czytelne i łatwe w utrzymaniu IMO.
źródło
ja stworzyłem tę klasę, która wykorzystuje RNGCryptoServiceProvider i jest elastyczna. Przykład:
źródło
Stworzyłem tę metodę podobną do dostępnej w dostawcy członkostwa. Jest to przydatne, jeśli nie chcesz dodawać odwołania internetowego w niektórych aplikacjach.
Działa świetnie.
źródło
System.Random
do krytycznych elementów bezpieczeństwa, takich jak hasła. UżyjRNGCryptoServiceProvider
Zawsze byłem bardzo zadowolony z generatora haseł wbudowanego w KeePass. Ponieważ KeePass to program .Net i oprogramowanie typu open source, postanowiłem trochę rozejrzeć się po kodzie. Skończyło się na tym, że po prostu odświeżyłem KeePass.exe, kopię dostarczoną w standardowej instalacji aplikacji, jako odniesienie w moim projekcie i napisałem poniższy kod. Możesz zobaczyć, jak elastyczna jest dzięki KeePass. Możesz określić długość, które znaki dołączyć / nie uwzględnić itp.
źródło
źródło
Dodam kolejną niewłaściwą odpowiedź do puli.
Mam przypadek użycia, w którym potrzebuję losowych haseł do komunikacji maszyna-maszyna, więc nie mam żadnych wymagań dotyczących czytelności dla ludzi. Nie mam również dostępu do
Membership.GeneratePassword
mojego projektu i nie chcę dodawać zależności.Jestem pewien, że
Membership.GeneratePassword
robi coś podobnego do tego, ale tutaj możesz dostroić pulę postaci, z których będziesz czerpać.I niektóre przykładowe dane wyjściowe:
Aby zapobiec reklamacjom związanym z użyciem
Random
: Głównym źródłem losowości jest nadal kryptowalut RNG. Nawet gdybyś mógł deterministycznie z góry ustalić sekwencję wychodzącąRandom
(powiedzmy, że została wyprodukowana1
), nadal nie znałbyś następnego znaku, który zostanie wybrany (choć to ograniczy zakres możliwości).Jednym prostym rozszerzeniem byłoby dodanie ważenia do różnych zestawów znaków, co może być tak proste, jak zwiększenie maksymalnej wartości i dodanie przypadkowych przypadków, aby zwiększyć wagę.
Dla bardziej humanistycznego generatora losowych haseł kiedyś zaimplementowałem system monitów, używając listy kości-słów EFF .
źródło
Lubię patrzeć na generowanie haseł, tak jak generowanie kluczy oprogramowania. Powinieneś wybierać spośród szeregu znaków, które przestrzegają dobrej praktyki. Weź to, na co @ Radu094 odpowiedział, i zmodyfikuj je, aby postępować zgodnie z dobrą praktyką. Nie umieszczaj każdej litery w tablicy znaków. Niektóre litery są trudniejsze do powiedzenia lub zrozumienia przez telefon.
Należy również rozważyć użycie sumy kontrolnej hasła, które zostało wygenerowane, aby upewnić się, że zostało wygenerowane przez Ciebie. Dobrym sposobem na osiągnięcie tego jest użycie algorytmu LUHN .
źródło
Oto, co szybko poskładałem.
źródło
Używam tego kodu do generowania hasła z kompozycją bilansu znaków alfabetu, liczb i znaków innych niż alfanumeryczne.
źródło
To jest krótkie i działa świetnie dla mnie.
źródło
Na mojej stronie używam tej metody:
Edytuj ciąg
_SymbolsAll
dla listy tablic.źródło
Dodano dodatkowy kod do zaakceptowanej odpowiedzi. Poprawia się po odpowiedzi przy użyciu Losowo i pozwala na pewne opcje hasła. Podobały mi się również niektóre opcje z odpowiedzi KeePass, ale nie chciałem uwzględniać pliku wykonywalnego w moim rozwiązaniu.
To był pierwszy link, kiedy szukałem generowania losowych haseł, a poniższe pytanie jest poza zakresem bieżącego pytania, ale może być ważne do rozważenia.
System.Web.Security.Membership.GeneratePassword
jest kryptograficznie bezpieczny, przy czym co najmniej 20% znaków nie jest alfanumeryczne.źródło
validChars może być dowolnym konstruktem, ale zdecydowałem się wybrać na podstawie zakresów kodu ascii usuwając znaki kontrolne. W tym przykładzie jest to ciąg 12 znaków.
źródło
źródło
Random
jako statycznąTen pakiet pozwala wygenerować losowe hasło, jednocześnie płynnie wskazując, które znaki powinien zawierać (w razie potrzeby):
https://github.com/prjseal/PasswordGenerator/
Przykład:
źródło
Jeśli chcesz skorzystać z kryptograficznie bezpiecznego generowania liczb losowych wykorzystywanego przez System.Web.Security.Membership.GeneratePassword, ale chcesz także ograniczyć zestaw znaków do znaków alfanumerycznych, możesz odfiltrować wynik za pomocą wyrażenia regularnego:
źródło
źródło
Wstawianie timera: timer1, 2 przyciski: button1, button2, 1 textBox: textBox1 i comboBox: comboBox1. Upewnij się, że deklarujesz:
Kod źródłowy:
źródło
System.Random
dla bezpieczeństwa.