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.
;================================================================================================================================
;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.
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%.
@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()
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?
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.
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.
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.
@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/)
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.
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.
Die Chance das Passwort zu erraten steigt, hab ich doch gesagt? Die Abwechselnde Konsonanten/Vokale Version ist unsicherer, habe nichts anderes behauptet?