Erzeugen lesbarer Passwörter

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Erzeugen lesbarer Passwörter

Beitrag von TroaX »

Ich habe ein wenig hin und her überlegt, wie man einen Passwortgenerator bauen könnte, damit man einigermaßen lesbare Passwörter bekommt. Mein erster Ansatz arbeitet mit Wordpattern und gibt so den Aufbau des Strings grob vor. Ansich funktioniert es. Aber ich versuche gerade noch eine Unterteilung von Buchstabenkombinationen zu etablieren. Denn Momentan kommen noch ziemlich abstrakte Gebilde raus.

Hier einmal mein Ansatz:

Code: Alles auswählen

EnableExplicit

Procedure.s RandomReadableString()
  Dim WordPattern.s(3)
  Dim Consonants.s(20)
  Dim Vocals.s(4)
  Dim SpecialChars.s(7)
  Dim Combinations.s(12)
  
  WordPattern(0) = "cvccvcsdddd"
  WordPattern(1) = "xvvcvcvddds"
  WordPattern(2) = "xvxvvcvcsdds"
  WordPattern(3) = "vcvvxvdcvcvsd"
  
  Consonants(0) = "B"
  Consonants(1) = "C"
  Consonants(2) = "D"
  Consonants(3) = "F"
  Consonants(4) = "G"
  Consonants(5) = "H"
  Consonants(6) = "J"
  Consonants(7) = "K"
  Consonants(8) = "L"
  Consonants(9) = "M"
  Consonants(10) = "N"
  Consonants(11) = "P"
  Consonants(12) = "Q"
  Consonants(13) = "R"
  Consonants(14) = "S"
  Consonants(15) = "T"
  Consonants(16) = "V"
  Consonants(17) = "W"
  Consonants(18) = "X"
  Consonants(19) = "Y"
  Consonants(20) = "Z"
  
  Vocals(0) = "A"
  Vocals(1) = "E"
  Vocals(2) = "I"
  Vocals(3) = "O"
  Vocals(4) = "U"
  
  SpecialChars(0) = "#"
  SpecialChars(1) = "."
  SpecialChars(2) = ":"
  SpecialChars(3) = "-"
  SpecialChars(4) = "_"
  SpecialChars(5) = "+"
  SpecialChars(6) = "?"
  SpecialChars(7) = "!"
  
  Combinations(0) = "st"
  Combinations(1) = "sp"
  Combinations(2) = "pl"
  Combinations(3) = "sch"
  Combinations(4) = "ch"
  Combinations(5) = "ll"
  Combinations(6) = "ss"
  Combinations(7) = "tt"
  Combinations(8) = "nn"
  Combinations(9) = "mm"
  Combinations(10) = "ck"
  Combinations(11) = "schl"
  Combinations(12) = "kr"
  
  Define PatternCount.i = ArraySize(WordPattern())
  Define ConsonantsCount.i = ArraySize(Consonants())
  Define VocalsCount.i = ArraySize(Vocals())
  Define SpecialCharsCount.i = ArraySize(SpecialChars())
  Define CombinationsCount.i = ArraySize(Combinations())
  
  Define Patternstring.s = WordPattern(Random(PatternCount,0))
  Define CurrentChar.s
  Define x.i
  
  Define GeneratedString.s = ""
  
  For x = 0 To Len(Patternstring)
    CurrentChar = Mid(Patternstring,x+1,1)
    Select CurrentChar
      Case "v"
        GeneratedString = GeneratedString + LCase(Vocals(Random(VocalsCount,0)))
      Case "c"
        GeneratedString = GeneratedString + LCase(Consonants(Random(VocalsCount,0)))
      Case "s"
        GeneratedString = GeneratedString + LCase(SpecialChars(Random(SpecialCharsCount,0)))
      Case "x"
        GeneratedString = GeneratedString + LCase(Combinations(Random(CombinationsCount,0)))
      Case "d"
        GeneratedString = GeneratedString + Str(Random(9,0))
      Default
        Break
    EndSelect
  Next
  ProcedureReturn GeneratedString    
EndProcedure


OpenConsole()
PrintN(RandomReadableString())
Input()
Ebenfalls noch geplant ist die Möglichkeit, auch mit Leetspeak zu arbeiten.

Hat da vielleicht noch wer eine Anregung, bevor ich weitermache oder wäre ein komplett anderer Ansatz besser?
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Erzeugen lesbarer Passwörter

Beitrag von NicTheQuick »

Du könntest jedenfalls alle Arrays außer Combinations durch einfache Strings ersetzen und mit Mid() auf die einzelnen Buchstaben zugreifen. Das wäre wesentlich einfacher und Cache-effizienter.
Da ich aber kein PB auf dem Handy habe, kann ich sonst gerade nicht viel dazu sagen.
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Erzeugen lesbarer Passwörter

Beitrag von TroaX »

Hmmm stimmt eigentlich. Danke für den Tip
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Erzeugen lesbarer Passwörter

Beitrag von NicTheQuick »

Mir fällt noch ein, dass der Ansatz mit Silben glaube ich immer gut funktioniert hat. Das heißt, du baust dir eine Liste aller möglichen Silben und reihst die einfach zufällig aneinander. Das sollte auch immer gut aussprechbar sein. Zudem könntest du dann z.B. immer alle zwei Silben einen Großbuchstaben setzen, z.B. "PackgeBlaunet".

Und denk innerhalb deiner Procedure noch daran das Schlüsseltwort "Protected" zu nutzen, wenn die Variablen oder Arrays lokal sind. Siehe auch mein Tutorial: [PB] Grundlegende Schlüsselwörter
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Erzeugen lesbarer Passwörter

Beitrag von TroaX »

Das mit den Schlüsselwörtern mache ich ja auch im Regelfall. Das ist doch nur der erste Entwurf und da der Code nur einmal ausgeführt wird, geht das ja noch alles glatt. :D
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Antworten