Passwörter generieren

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
BlackFish
Beiträge: 9
Registriert: 31.12.2012 15:29

Passwörter generieren

Beitrag von BlackFish »

Ein kleines Beispiel, dass zeigt, wie man mit PB verschiedene Arten von Passwörtern erzeugen kann:

Code: Alles auswählen

;================================================================================================================================
;SUBJECT: A small snippet to generate different types of passwords
;AUTHOR:  codeprof aka BlackFish
;LICENSE: PUBLIC DOMAIN (can be used without any restriction)
;         This software is provided 'as-is', without any express or implied warranty.
;         In the author cannot be held liable for any damages arising from the use of this software.
;         Use this software at your own risk. 
;DATE:    2013-03-10
;================================================================================================================================
Procedure.s GenerateReadablePassword(length.i = 6)
  Protected i, password.s = "" 
  Protected vocs.s = "aeiou"
  Protected cons.s = "bcdfghjklmnpqrstvwxyz"
  If OpenCryptRandom() 
  For i = 0 To length-1
    If i & 1
      password.s + Mid(vocs, CryptRandom(Len(vocs) - 1) + 1, 1)
    Else
      password.s + Mid(cons, CryptRandom(Len(cons) - 1) + 1, 1)       
    EndIf 
  Next
   CloseCryptRandom() 
  EndIf 
  ProcedureReturn password
EndProcedure

Procedure.s GenerateRandomPassword(length.i = 30, allowedChars.s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$&§!?%*+-_")
  Protected i, password.s = ""
  If OpenCryptRandom()
    For i = 0 To length - 1
      password.s + Mid(allowedChars, CryptRandom(Len(allowedChars) - 1) + 1, 1)
    Next
    CloseCryptRandom()
  EndIf
  ProcedureReturn password
EndProcedure  

Procedure.s GeneratePassphrasePassword(length.i = 25, allowedSpecialChars.s = "$&§!?%*+-_")
  Protected password.s = ""  
  While (Len(password) < length)
    password + GenerateReadablePassword(4) + " " 
    password + GenerateRandomPassword(4, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + allowedSpecialChars) + " "  
  Wend  
  
  password = Trim(Left(password, length))
  allowedSpecialChars = ReplaceString(allowedSpecialChars, " ", "")
  password + GenerateRandomPassword(length - Len(password), "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + allowedSpecialChars)
  ProcedureReturn password
EndProcedure  


For t=0 To 24
  Debug GenerateReadablePassword()
Next

For t=0 To 24
  Debug GenerateRandomPassword()
Next

For t = 0 To 24
  Debug GeneratePassphrasePassword()
Next 
/edit: kleine Verbesserung bzgl. Var. Deklaration. Danke an ts-soft
Zuletzt geändert von BlackFish am 10.03.2013 15:19, insgesamt 1-mal geändert.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Passwörter generieren

Beitrag von cxAlex »

Gefällt mir, nur könntest du zur Verbesserung noch das ganze auf 1. Procedure beschränken und die verschiedenen Zeichen-Sets per Macro definieren, so sparst du dir viele Code Redundanzen. Nebenbei fängst du dir bei GenerateReadablePassword() eine kryptographische Schwachstelle ein (abgesehen davon das 6 eine zu kurze Länge ist, bitte mindestens 8 und verwende auch Zahlen dazu, gleich viel besser).

Bei deiner Generierung ist jeder 2. Buchstabe ein Vokal und jeder 2. ein Konsonant. Das stärkt das Passwort aber nicht sondern schwächt es. Ist dieses Schema bekannt sinkt die Chance das Passwort zu "erraten"/"brute-forcen" bei jedem Versuch von (1/26)^6 auf (1/21 * 1/5) ^ 3 also von ~ 0.04% auf ~0.3%.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
BlackFish
Beiträge: 9
Registriert: 31.12.2012 15:29

Re: Passwörter generieren

Beitrag von BlackFish »

@cxAlex
Danke für dein Feedback.
Ja da hast du recht, aber GenerateReadablePassword() hab ich programmiert um ein möglichst lesbares Passwort zu generieren. Durch eine größere Länge, Großbuchstaben, Zahlen... wird es schlechter lesbar. Dafür gibt es dann ja GenerateRandomPassword()
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Passwörter generieren

Beitrag von cxAlex »

BlackFish hat geschrieben:@cxAlex
Danke für dein Feedback.
Ja da hast du recht, aber GenerateReadablePassword() hab ich programmiert um ein möglichst lesbares Passwort zu generieren. Durch eine größere Länge, Großbuchstaben, Zahlen... wird es schlechter lesbar. Dafür gibt es dann ja GenerateRandomPassword()
Ja, ok aber du könntest doch zumindest das Vokal - Konsonant Abwechseln ausbauen und jeden Buchstaben an jeder Stelle zulassen? Das würde schonmal die Passwort - Stärke erhöhen und die Lesbarkeit nicht beeinflussen?

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Passwörter generieren

Beitrag von ts-soft »

Wäre nett, wenn Du noch die 2 variablen in GenerateReadablePassword deklarieren würdest, damit es
auch mit EnableExplicit klappt.

Code: Alles auswählen

Procedure.s GenerateReadablePassword(length.i = 6)
  Protected i, password.s = "" 
  Protected vocs.s = "aeiou"
  Protected cons.s = "bcdfghjklmnpqrstvwxyz"
  If OpenCryptRandom() 
  For i = 0 To length-1
    If i & 1
      password.s + Mid(vocs, CryptRandom(Len(vocs) - 1) + 1, 1)
    Else
      password.s + Mid(cons, CryptRandom(Len(cons) - 1) + 1, 1)       
    EndIf 
  Next
   CloseCryptRandom() 
  EndIf 
  ProcedureReturn password
EndProcedure
Gruß
Thomas

/edit
und im anderem Beitrag ist val.q auch nicht deklariert, danke :wink:
http://www.purebasic.fr/german/viewtopi ... 72#p309972
Zuletzt geändert von ts-soft am 10.03.2013 14:47, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: Passwörter generieren

Beitrag von NicTheQuick »

Ich würde vor allem eher eine Bit-Angabe machen und nicht eine Längenangabe. So kann man im Voraus bestimmen wie viele Zufallsbits das Passwort enthalten soll.

Code: Alles auswählen

EnableExplicit

Procedure.s GenerateReadablePassword(bits.i = 128)
	If (bits > 1021)
		bits = 1021
	EndIf
	Static vocs.s = "aeiou"
	Static cons.s = "bcdfghjklmnpqrstvwxyz"
	
	Protected i.i, password.s = ""
	Protected invPossibility.d = 1.0
	
	If OpenCryptRandom()
		While bits > (Log(invPossibility) / Log(2))
			If i & 1
				password.s + Mid(vocs, CryptRandom(Len(vocs) - 1) + 1, 1)
				invPossibility * Len(vocs)
			Else
				password.s + Mid(cons, CryptRandom(Len(cons) - 1) + 1, 1)      
				invPossibility * Len(cons)
			EndIf
			;Debug password + " (Bits: " + StrD((Log(invPossibility) / Log(2)), 10) + ")"
			i + 1
		Wend
		CloseCryptRandom() 
	EndIf 
	ProcedureReturn password
EndProcedure
Update: Ich habe es mal mit der inversen Wahrscheinlichkeit gemacht. Das macht zwar keinen Unterschied, aber egal. Besonders genau wird die Funktion aber trotzdem nicht sein, da Doubles nun mal insgesamt nur aus 64 Bit bestehen. Und deshalb kann es passieren, dass bei Passwörtern oberhalb der 64 Bit mal ein Buchstabe mehr oder weniger ausgegeben wird als es sein sollte.

Update 2: Ich habe noch eine Begrenzung eingebaut. Ab 1022 Bits gibt es eine Endlosschleife, weil die Doubles dann nicht mehr ausreichen.
BlackFish
Beiträge: 9
Registriert: 31.12.2012 15:29

Re: Passwörter generieren

Beitrag von BlackFish »

@cxAlex
Die abwechselnden Vokale und Konsonanten sollen das Wort ausspechbar machen und damit ist es (hoffentlich) besser merkbar. ( wird in einem Algoritmus von der NIST vorgeschlagen siehe http://www.marchansen.com/tn108/)

@NicTheQuick
Interresanter Vorschalg :)
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Passwörter generieren

Beitrag von WPö »

Moin, Alex!
cxAlex hat geschrieben:... Ist dieses Schema bekannt sinkt die Chance das Passwort zu "erraten"/"brute-forcen" bei jedem Versuch von (1/26)^6 auf (1/21 * 1/5) ^ 3 also von ~ 0.04% auf ~0.3%.
??? Kann ich nix verstehen.
(1/26)^6 ergibt 3,237e-9.
(1/21 * 1/5)^3 ergibt 455,2e-9, was das 140fache ist.
Die Chance, das Paßwort zu erraten, steigt also. Das haben bereits andere Kommentatoren festgehalten.

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Passwörter generieren

Beitrag von cxAlex »

WPö hat geschrieben: (1/26)^6 ergibt 3,237e-9.
(1/21 * 1/5)^3 ergibt 455,2e-9, was das 140fache ist.
Die Chance, das Paßwort zu erraten, steigt also. Das haben bereits andere Kommentatoren festgehalten.
(1/21 * 1/5)^3 ergibt 8,64e-7 .... (http://bit.ly/13Q5Do9)

Die Chance das Passwort zu erraten steigt, hab ich doch gesagt? Die Abwechselnde Konsonanten/Vokale Version ist unsicherer, habe nichts anderes behauptet? :?

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Passwörter generieren

Beitrag von WPö »

Ups - im Wert vertan. Du hast Recht. Ist ja wurscht - wir wissen, was gemeint ist.
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Antworten