1. #1

    Registriert seit
    29.07.2012
    Beiträge
    4
    Thanked 3 Times in 1 Post

    Standard GenerateSecurePassword

    Hallo,

    folgende Funktion:

    PHP-Code:
     /// <summary>
            /// Generiert ein Sicheres Passwort!
            /// </summary>
            /// <param name="length">Die Länge des gewünschten Passworts</param>
            /// <returns>Ein sicheres Passwort in Form eines Strings</returns>
            
    public String GenerateSecurePassword(int length)
            {
                if (
    length <= 8) throw new Exception("Password-Length must be over 8 to be secure!");
                
                
    StringBuilder password = new StringBuilder();
                
    charlastChar null;
                
    Random rnd = new Random();

                for (
    int i 0lengthi++)
                {
                    
    char generatedChar;

                    switch (
    rnd.Next(4)) //Zufällig auswählen zwischen Groß- und Kleinbuchstaben sowie Zahlen und Sonderzeichen!
                    
    {
                           
                        case 
    0//A-Z
                            
    generatedChar = (char)rnd.Next(0x510x5B);
                            break;
                        case 
    1://a-z
                            
    generatedChar = (char)rnd.Next(0x610x7B);
                           break;
                        case 
    2//0-9
                           
    generatedChar = (char)rnd.Next(0x300x3A);
                           break;
                        default: 
    //Sonderzeichen
                           
    generatedChar = (char)rnd.Next(0x210x41);
                           while (
    generatedChar >= 0x30 && generatedChar 0x3A//Keine Zahlen bei Sonderzeichen!!
                           
    {
                               
    generatedChar = (char)rnd.Next(0x210x41);
                           }
                           break;
                    }

                    if (
    generatedChar == lastChar//Verhindern das der generierte Char dem alten entspricht
                    
    {
                        
    i--;
                    }
                    else
                    {
                        
    password.Append(generatedChar);
                        
    lastChar generatedChar;
                    }
                }
                return 
    password.ToString();
            } 
    Generiert:
    • Ein Passwort in der gewünschten Länge, welches den Richtlinien von DMW entspricht
    • Ein Passwort, welches keine hintereinander wiederholende Zeichen hat
    • Ein Passwort mit Sonderzeichen, Zahlen und Groß- sowie Kleinbuchstaben


    Es ist für mich persönlich klar, dass dieses Passwort dann am Besten in einem PasswortSafe gespeichert werden sollte, weil es sich nicht einfach merken lässt aber laut der How Secure Is My Password? - Website ist das Passwort dafür auch sehr sicher!

    #XChunk
    Geändert von XChunk (10.08.2012 um 14:15 Uhr)

  2. The Following 3 Users Say Thank You to XChunk For This Useful Post:

    Dbzfreak1337 (07.08.2012), Minecraft (07.08.2012), Sky.NET (07.08.2012)

  3. #2
    Avatar von Sky.NET
    Registriert seit
    26.11.2011
    Beiträge
    2.462
    Thanked 2.718 Times in 1.287 Posts
    Blog Entries
    7

    Standard AW: GenerateSecurePassword

    Die eigentliche Programmlogik lässt sich auf 1 Zeile kürzen:

    PHP-Code:
            public static void GeneratePassword()
            {
                
    //Usereingabe die nur einen int annimmt (defensive coding!)
                
    int length 0;
                do
                {
                    
    Console.WriteLine("Bitte gewünschte Passwortlänge eingeben");
                    
    int.TryParse(Console.ReadLine(), out length);
                }
                while (
    length <= && length int.MaxValue);
                
    //Hier wird das passwort generiert
                
    string securePassword string.Join(string.Empty, Enumerable.Repeat(new Random(), length).Select(=> (char)r.Next(33127)));
                
    //Ausgabe
                
    Console.WriteLine(securePassword);
                
    //Alle Happy -> beenden mit Enter
                
    Console.ReadLine();
            } 
    in
    PHP-Code:
    string securePassword string.Join(string.Empty, Enumerable.Repeat(new Random(), length).Select(=> (char)r.Next(33127))); 
    steckt die komplette Logik.
    Geändert von Sky.NET (10.08.2012 um 19:12 Uhr)

  4. #3

    Registriert seit
    19.11.2011
    Beiträge
    496
    Thanked 412 Times in 268 Posts

    Standard AW: GenerateSecurePassword

    Kann man auch als
    nicht .netler
    lesen.
    Die verwendeten Methoden sind doch sehr aussagekräftig.
    string.Join fügt 'ne Zeichenkette zwischen jedes Element eines Array ein. Enumerable.Repeat erzeugt "length Mal" ein neues Random-Objekt, mit dem jeweils pseudozufällige Characters aus dem ASCII-Bereich 33-127 erzeugt werden, die dann später zu einer aus Characters bestehenden Liste hinzugefügt werden (bzw. zu einer gemacht werden).
    Geändert von Mr. White (10.08.2012 um 16:01 Uhr)

  5. The Following User Says Thank You to Mr. White For This Useful Post:

    Sky.NET (10.08.2012)

  6. #4
    Avatar von Sky.NET
    Registriert seit
    26.11.2011
    Beiträge
    2.462
    Thanked 2.718 Times in 1.287 Posts
    Blog Entries
    7

    Standard AW: GenerateSecurePassword

    @DANP (der Beitrag wurde gelöscht)

    Fullquote = Fail
    Und da es in diesem Sub um das .NET FW geht, ist deine Bitte ein wenig fragwürdig.
    Ich erklärs aber mal für .NET Noobs.

    PHP-Code:
                string securePassword 
                    
    //String.Join = eine Aufzählung von Zeichenketten unterverwendung eines Trennzeichens zusammenfügen
                    
    string.Join(
                        
    //Unser Trennzeichen ist leer
                        
    string.Empty,
                        
    //Enumerable.Repeat ist eine LinQ-Funktion und generiert eine Sequenz eines Wertes (normalerweise immer der gleiche Wert)
                        
    Enumerable.Repeat(
                            
    //erzeugt einen zufälligen Wert
                            
    new Random(),
                            
    //und zwar so oft wir das wollen
                            
    length
                        
    )
                        
    //Wieder eine LinQ-Funktion, welche jedes Element in der Sequenz nach einem bestimmten Schema umwandelt
                        
    .Select(
                            
    //Nun folgt eine anonyme Methode, auch Lambda-Expression genannt
                            //in welcher jedes Element zuerst in die variable r gelegt wird
                            
    =>
                                
    //Und anschließend in einen zufälligen Char konvertiert wird (33-127 sind die 'normalen' zeichen der UTF-8 CharMap
                                
    (char)r.Next(33127)
                            )                    
                    ); 
    das .ToList<char>() hatte ich nur testweise angefügt, das kann weggelassen werden, weil Enumerable.Repeat schon IEnumerable implementiert, was von string.Join erwartet wird, doppelte konvertierung ist sinnlos, habe das auch oben aus dem Quelltext gelöscht.
    Geändert von Sky.NET (10.08.2012 um 16:23 Uhr)

Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.