none
Passwortgenerator RRS feed

  • 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?

     

     

    Freitag, 17. Dezember 2010 12:32

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-rngcryptoserviceprovider

    Imports 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

    Freitag, 17. Dezember 2010 15:34
    Beantworter

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-rngcryptoserviceprovider

    Imports 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

    Freitag, 17. Dezember 2010 15:34
    Beantworter
  • 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
    Freitag, 17. Dezember 2010 18:33
  • 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

    Samstag, 18. Dezember 2010 09:46
    Beantworter
  • 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
    Montag, 20. Dezember 2010 08:36
  • 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

    Montag, 20. Dezember 2010 09:28
    Beantworter