Berechnung Passwortstärke in C#

In einem aktuellen Projekt besteht der Wunsch die Passwortstärke im Frontend anzuzeigen. Aber wie macht man das am besten. Was ein gutes Passwort ist weiß man ja.. aber wie berechnen 🙂

Man muss aber auch anerkennen, dass 20 Zahlen genauso sicher sind, wie z.b. ein kürzeres Passwort aber mit mehr Variation. Also z.B. Aki§23mE% 

Das heißt: Je komplexer ein Passwort ist, in Abhängigkeit von der Länge, desto sicherer ist es.

–> Der Code ist weiter unten 🙂

Beispiel: wenn ich nur Zahlen verwende, habe ich 10 Symbole. Bei einer Länge von Eins habe ich also eine Chance von 1:9 das richtige zu treffen. Bei 2 Zahlen sind es schon 100 Möglichkeiten u.s.w. Wenn ich Buchstaben nehme sind es 26, wenn ich Groß- und Kleingeschriebene nehme sind es 52.  

Aus dem Vortrag von Dr. Robert Formanek (Uni Hohenheim) (Link zur Präsentation):

Also N (Zeichenvorrat) hoch L (Länge des Passwortes) sind die Möglichkeiten => 95 ^6 => 735.091.890.625 Möglichkeiten (2^40 ==> 40 Bit Entropie) bei 6 Zeichen (a-z, A-Z,0-9 und Sonderzeichen). Wenn eine Grafikkarte also so rund 1Milliarde Passwörter pro Sekunde erproben kann würde es rund 17 Minuten Dauern. 

  • Bei 50Bit Entropie (7 Zeichen) dauert es schon 12 Tage (PC Baujahr 2011) 
  • Bei 52 Bit Entropie ( 8 Zeichen) würde es auf einem Amazon EC2 mit > 1000 Rechnern nur wenige Stunden dauern.
    • Bei über 65 Bit allerdings wohl >94 Jahre !

Werden jetzt “Wörter” verwendet wie Auto2Blume4 muss man neu denken. Da Auto und Blume hier eigene Symbole sind (Diceware) und hätte jetzt 2 Wörter + 2 zahlen.

Code

In unser Funktion muss als erstes bestimmt werden wie viele Zeichen wie nutzen könnten und dann kann man schon rechnen. Wir übergeben der Funktion also das passwort und den Bereich in der ASCII Tabelle von wo bis wo er schauen soll. Gibt es ein Zeichen aus dem Bereich gibt er uns die summe der bereiche zurück

 private int CountPossibleCharactersAndGiveBack(string password, params (int, int)[] range)
        {
            var RangeCount = range.Sum(p => Math.Abs(p.Item2 - p.Item1) + 1);
            foreach ((int, int) tuple in range)
            {
                if (password.ToCharArray().Any(p => p >= tuple.Item1 && p <= tuple.Item2))
                {
                    return RangeCount;
                }
            }

            return 0;
        }

Das nutzen wir dann hier wo dann auch die Berechnung statt findet:

       public int CalcPasswortEntropie(string password)
        {
            var numberOfCharactersN = 0;
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (48, 57)); // Zahlen
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (97, 122)); // kleine Buchstaben
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (65, 90)); // große Buchstaben
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (32, 47), (58, 64), (91, 96), (123, 126)); // Sonderzeichen
            numberOfCharactersN += CountPossibleCharactersAndGiveBack(password, (128, 254)); // alles über 128 Akzente und so

            var lengthOfPassword = password.Length;
            var potenzNhochL = Math.Pow(numberOfCharactersN, lengthOfPassword);
            var entropie = Math.Log(potenzNhochL, 2);
            return (int)Math.Round(entropie, 0, MidpointRounding.ToPositiveInfinity);
        }

Das ganze wird noch gerundet nach oben und man hat die Bits die genutzt werden.

Abschließend noch eine Tabelle aus der Wikipedia zur Passwort Entropie, damit man ein Gefühl bekommt wie ein Passwort sein muss. Aber prinzipell reicht ein Passwort mit einer Entropie über 53. Besser ist mehr 😉

Lizenz des Codes: MIT

Über Danny Sotzny

Hallo, ich bin Danny Sotzny und bin Software- entwickler und Fotograf. Dabei beschäftige ich mich mit aktuellen Technologien und bekannten Problemen. Schwerpunkte setze ich bei der Webentwicklung (PHP/JS) und der Software- entwicklung mit .NET (C#). Der Blog dient für mich selbst als Gedächtnishilfe für typische und alltägliche Probleme, aber auch persönliche Erlebnisse werden veröffentlicht. Ich betreibe zusätzlich noch Foto-Sotzny.de für meine Fotografien und sotzny.net, was meine Webseite für die Softwareentwicklung ist.
Dieser Beitrag wurde unter Nützliches abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..