Benutzer mit den meisten Antworten
Passwortgenerator

Frage
-
Hi zusammen, wißt ihr wo ich einen Passwortgenerator (Sourcecode VB.Net) finde, mit dem man Passwörter mit folgenden Kriterien generieren kann.
-Passwörter beliebiger Länge
-Auswahl ob mit Sonderzeichen, Klein/Großbuchstaben,Zahlen usw.
-Vorgabe eines Begriffes, mit dem soll das eigentliche Wort noch mal verschlüsselt werden
-Unterschiedliche Verschlüsselungsverfahren
-was bräuchte man noch?
Antworten
-
Hallo Michael,
ich weiss nicht was Du da alles einbauen willst, wichtig ist eigentlich nur das es möglichst zufällig ist.
Ich weiss nicht, was Du weiter verschlüsseln willst, unterschiedliche Verfahren bringen fürs Erzeugen wenig Mehrwehrt.Unten mal etwas was ich zusammengebastelt hatte unter Zuhilfenahme des RNGCryptoServiceProvider
siehe auch http://stackoverflow.com/questions/418817/pros-and-cons-of-rngcryptoserviceproviderImports System.Security.Cryptography Imports System.Text Public Class PasswordGenerator Private Shared __simplePasswordChars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstvwxyz" ' Kleines Subset (je nach Umgebung können einige Zeichen problematisch sein) Private Shared __specialPasswordChars As String = "!#%&()*,-./:;?[\]_{|}§" Dim _rngProvider As RNGCryptoServiceProvider Dim _passwordChars As Char() Dim _passwordCharsLength As Integer Dim _passwordLength As Integer Dim _iv As Byte() Dim _ivLength As Integer Dim _ivIndex As Integer Public Sub New(ByVal passwordLength As Integer, ByVal useSpecialChars As Boolean) If passwordLength < 1 Or passwordLength > 128 Then Throw New ArgumentOutOfRangeException("passwordLength") End If Me._passwordLength = passwordLength If useSpecialChars Then Me._passwordChars = (__specialPasswordChars & __simplePasswordChars).ToCharArray() Else Me._passwordChars = __simplePasswordChars.ToCharArray() End If Me._passwordCharsLength = _passwordChars.Length Me._rngProvider = New RNGCryptoServiceProvider() Me._ivLength = Me._passwordLength * 2 Me._iv = New Byte(Me._ivLength - 1) {} End Sub Public Function Generate() As String InitializeIV() Dim password As New StringBuilder(Me._passwordLength) For index As Integer = 0 To Me._passwordLength - 1 password.Append(NextChar) Next Return password.ToString() End Function Private Sub InitializeIV() Me._rngProvider.GetNonZeroBytes(Me._iv) Me._ivIndex = 0 End Sub Private Function NextByte() As Byte ' Liefert das nächste Byte If Me._ivIndex >= Me._ivLength Then InitializeIV() End If Dim value As Byte = Me._iv(Me._ivIndex) Me._ivIndex += 1 Return value End Function Private Function NextChar() As Char ' Zwei Bytes für bessere Verteilung Dim charIndex As Integer = CType(NextByte(), Integer) + CType(NextByte(), Integer) charIndex = charIndex Mod Me._passwordCharsLength Return Me._passwordChars(charIndex) End Function Friend Shared Sub Test() Const PasswordLength As Integer = 6 Const MaxRuns As Integer = 100000 Dim generator As New PasswordGenerator(PasswordLength, False) Dim passwords As New HashSet(Of String) Dim watch As New Stopwatch() watch.Start() Dim duplicateCount As Integer = 0 For index As Integer = 0 To MaxRuns - 1 Dim password As String = generator.Generate() If passwords.Contains(password) Then Console.WriteLine("Duplicate at: {0} = {1}", index, password) duplicateCount += 1 End If passwords.Add(password) 'If (index Mod 1000) = 0 Then ' Console.WriteLine("Generated {0} passwords", index) 'End If Next watch.Stop() Console.WriteLine("Generation Time: {0} for {1} ({2} Duplicates)", watch.ElapsedMilliseconds, MaxRuns, duplicateCount) Using writer As New System.IO.StreamWriter("C:\passwords.txt", False, System.Text.Encoding.Default) For Each password As String In passwords writer.WriteLine(password) Next End Using Dim totalCount As Long Dim charUsage As New SortedDictionary(Of Char, Long) For Each password As String In passwords For Each ch In password Dim value As Long If charUsage.TryGetValue(ch, value) Then value += 1 Else value = 1 End If charUsage(ch) = value totalCount += 1 Next Next Using writer As New System.IO.StreamWriter("C:\passwordchars.txt", False, System.Text.Encoding.Default) writer.WriteLine("Average: {0} Chars => {1} Count", charUsage.Count, totalCount \ charUsage.Count) For Each value In charUsage writer.WriteLine("Char: {0} = {1} ({2:p3})", value.Key, value.Value, 1.0 * value.Value / totalCount) Next End Using End Sub End Class
Der Zeichenvorrat wird dort nur nach Zeichen/Zahlen mit oder ohne Sonderzeichen festgelegt,
was sich aber einfach ändern lässt. Ebenso die eingebaute Grenze von 128 Zeichen.Am Ende findest Du eine kleine Testmethode inkl. minimaler Auswertung.
Googeln nach Password Generator VB.NET liefert Dir weitere.
Gruß Elmar
- Als Antwort vorgeschlagen Ellen Ramcke Samstag, 18. Dezember 2010 10:32
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 22. Dezember 2010 10:55
Alle Antworten
-
Hallo Michael,
ich weiss nicht was Du da alles einbauen willst, wichtig ist eigentlich nur das es möglichst zufällig ist.
Ich weiss nicht, was Du weiter verschlüsseln willst, unterschiedliche Verfahren bringen fürs Erzeugen wenig Mehrwehrt.Unten mal etwas was ich zusammengebastelt hatte unter Zuhilfenahme des RNGCryptoServiceProvider
siehe auch http://stackoverflow.com/questions/418817/pros-and-cons-of-rngcryptoserviceproviderImports System.Security.Cryptography Imports System.Text Public Class PasswordGenerator Private Shared __simplePasswordChars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstvwxyz" ' Kleines Subset (je nach Umgebung können einige Zeichen problematisch sein) Private Shared __specialPasswordChars As String = "!#%&()*,-./:;?[\]_{|}§" Dim _rngProvider As RNGCryptoServiceProvider Dim _passwordChars As Char() Dim _passwordCharsLength As Integer Dim _passwordLength As Integer Dim _iv As Byte() Dim _ivLength As Integer Dim _ivIndex As Integer Public Sub New(ByVal passwordLength As Integer, ByVal useSpecialChars As Boolean) If passwordLength < 1 Or passwordLength > 128 Then Throw New ArgumentOutOfRangeException("passwordLength") End If Me._passwordLength = passwordLength If useSpecialChars Then Me._passwordChars = (__specialPasswordChars & __simplePasswordChars).ToCharArray() Else Me._passwordChars = __simplePasswordChars.ToCharArray() End If Me._passwordCharsLength = _passwordChars.Length Me._rngProvider = New RNGCryptoServiceProvider() Me._ivLength = Me._passwordLength * 2 Me._iv = New Byte(Me._ivLength - 1) {} End Sub Public Function Generate() As String InitializeIV() Dim password As New StringBuilder(Me._passwordLength) For index As Integer = 0 To Me._passwordLength - 1 password.Append(NextChar) Next Return password.ToString() End Function Private Sub InitializeIV() Me._rngProvider.GetNonZeroBytes(Me._iv) Me._ivIndex = 0 End Sub Private Function NextByte() As Byte ' Liefert das nächste Byte If Me._ivIndex >= Me._ivLength Then InitializeIV() End If Dim value As Byte = Me._iv(Me._ivIndex) Me._ivIndex += 1 Return value End Function Private Function NextChar() As Char ' Zwei Bytes für bessere Verteilung Dim charIndex As Integer = CType(NextByte(), Integer) + CType(NextByte(), Integer) charIndex = charIndex Mod Me._passwordCharsLength Return Me._passwordChars(charIndex) End Function Friend Shared Sub Test() Const PasswordLength As Integer = 6 Const MaxRuns As Integer = 100000 Dim generator As New PasswordGenerator(PasswordLength, False) Dim passwords As New HashSet(Of String) Dim watch As New Stopwatch() watch.Start() Dim duplicateCount As Integer = 0 For index As Integer = 0 To MaxRuns - 1 Dim password As String = generator.Generate() If passwords.Contains(password) Then Console.WriteLine("Duplicate at: {0} = {1}", index, password) duplicateCount += 1 End If passwords.Add(password) 'If (index Mod 1000) = 0 Then ' Console.WriteLine("Generated {0} passwords", index) 'End If Next watch.Stop() Console.WriteLine("Generation Time: {0} for {1} ({2} Duplicates)", watch.ElapsedMilliseconds, MaxRuns, duplicateCount) Using writer As New System.IO.StreamWriter("C:\passwords.txt", False, System.Text.Encoding.Default) For Each password As String In passwords writer.WriteLine(password) Next End Using Dim totalCount As Long Dim charUsage As New SortedDictionary(Of Char, Long) For Each password As String In passwords For Each ch In password Dim value As Long If charUsage.TryGetValue(ch, value) Then value += 1 Else value = 1 End If charUsage(ch) = value totalCount += 1 Next Next Using writer As New System.IO.StreamWriter("C:\passwordchars.txt", False, System.Text.Encoding.Default) writer.WriteLine("Average: {0} Chars => {1} Count", charUsage.Count, totalCount \ charUsage.Count) For Each value In charUsage writer.WriteLine("Char: {0} = {1} ({2:p3})", value.Key, value.Value, 1.0 * value.Value / totalCount) Next End Using End Sub End Class
Der Zeichenvorrat wird dort nur nach Zeichen/Zahlen mit oder ohne Sonderzeichen festgelegt,
was sich aber einfach ändern lässt. Ebenso die eingebaute Grenze von 128 Zeichen.Am Ende findest Du eine kleine Testmethode inkl. minimaler Auswertung.
Googeln nach Password Generator VB.NET liefert Dir weitere.
Gruß Elmar
- Als Antwort vorgeschlagen Ellen Ramcke Samstag, 18. Dezember 2010 10:32
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 22. Dezember 2010 10:55
-
Hallo Elmar,
Code funktioniert. Jede Menge Passwörter!!
Eine Frage zu dieser Zeile:
Me._iv = New Byte(Me._ivLength - 1) {}
Eine neues Byte Array erzeugen mit Initialsierung {}. Also Wert 0 ??
schöne Grüße Ellen
Ich benutze/ I'm using VB2008 & VB2010 -
Hallo Ellen,
ja, damit wird ein neues Array ohne Initialisierung von Werten erzeugt,
siehe Arrays in Visual Basic Abschnitt Erstellen eines Arrays.Arrays ohne Initalisierung werden in .NET mit dem Standardwert (also 0) initialisiert.
Die etwas krude Syntax ergibt sich daraus, dass Visual Basic sonst
nicht zwischen der Dimensonierung (mit runden Klammern) und dem Aufruf
des Konstrukturs (ebenfalls runde Klammern) unterscheiden könnte,
wie es auch der Hinweis in der MSDN versucht zu erläutern.Gruß Elmar
-
Hallo Elmar, jupp danke klappt soweit.
Im Netz hatte ich auch noch folgendes gefunden.
Dim lChar As Long Dim lCount As Long Dim sMD5 As String Dim sKey As String Dim md5 As MD5 = Security.Cryptography.MD5.Create() Dim original As String = (sRegisteredName) & sAppChars Dim encoded As String = BitConverter.ToString(md5.ComputeHash(Encoding.ASCII.GetBytes(original))).Replace("-", "") sKey ="" For lCount = 1 To 16 lChar = CLng("&H" & Mid(encoded, (lCount * 2) - 1, 2)) Mod 32 sKey = sKey & Mid(VALID_CHARS, lChar + 1, 1) Next
- Bearbeitet Robert BreitenhoferModerator Mittwoch, 22. Dezember 2010 11:00 Formatierung
-
Hallo Michael,
die "Fundstelle" würde ich so nicht verwenden.
Auch wenn man vernachlässigt, dass MD5 als nicht mehr sonderlich sicher gilt,
sieht auch der nachfolgende Code sehr nach "Bastelstunde" aus.
Vor allem fehlt jede Zufälligkeit. Kennt man sRegisterName & AppName so
ergibt sich der gleiche Hash und man kann das "Kennwort" ermitteln.Längere Kennwörter funktionieren ebenfalls nicht (wegen 128 Bit => 16 Byte)
und kürzere können wiederum mehr Kollisionen erzeugen.Gruß Elmar