Visual Basic密码生成器

Tim*_*nah 5 .net vb.net passwords generator

我的任务是创建一个可视化的基本随机密码生成器.我已经提出了下面的工作,但它的密码标准有点粗糙.我希望它生成的每个密码至少包含1个数字,大写和小写.然而,我如何对此进行编码会产生随机组合,这通常会导致错过其中一个标准.

我自己有一个游戏,我将有三个字符串,一个是大写字母,一个是小写字母,第三个是数字.一旦它有一个,它将使用我的代码生成其余的密码.这听起来不是很干净,我一直在做这个问题.

任何人都可以帮助我指出正确的方向或协助下面的代码.密码长度必须介于6到20个字符之间.

提前致谢

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox2.Text = GenerateCode()
    End Sub

    Private Function GenerateCode() As Object
        Dim intRnd As Object
        Dim intStep As Object
        Dim strName As Object
        Dim intNameLength As Object
        Dim intLength As Object
        Dim strInputString As Object
        strInputString = "1234567890ABCDEFGHIJKLMEOPQRSTUWXYZabcdefghijklmnopqrstuvwxyz"

        intLength = Len(strInputString)

        Randomize()


        strName = ""

        'Check for valid numeric entry
        If Integer.TryParse(TextBox1.Text, intNameLength) And intNameLength >= 6 And intNameLength <= 20 Then
            For intStep = 1 To intNameLength
                intRnd = Int((intLength * Rnd()) + 1)

                strName = strName & Mid(strInputString, intRnd, 1)

            Next
            GenerateCode = strName
        Else
            TextBox1.Text =("Please enter a valid password length")
        End If

    End Function
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        My.Computer.Clipboard.SetText(TextBox2.Text)

    End Sub

    Private Sub TextBox1_Enter(sender As Object, e As EventArgs) Handles TextBox1.Enter
        TextBox1.Text = ""
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

==========更新==========

我已经改变了我的代码,所以我现在有三个不同字符的字符串,1个用于鞋面,一个用于降低,一个用于数字.

这使我能够在表单中使用复选框功能.我玩了代码,它现在生成密码取决于我选择的复选框,正如我所说的很棒然而我总是保证如果我选择,数字,上限和下限我会得到一个包含所有三个密码,有时密码只包含数字,即使检查了所有三个框.

在猜测这与事实有关,我只是要求它使用我给它的字符生成随机密码,并且没有验证它已经使用了所有这三个选项.

对此的任何帮助都会很棒.我正在努力,我不只是张贴,希望有人能为我做这项工作.如果有人能指出我正确的方向会很棒.

这是我的新代码.

Public Function GenerateCode()
    Dim intRnd As Integer
    Dim intStep As Integer = Nothing
    Dim strname As String
    Dim intlength As Integer
    Dim strinputstring As String = ""
    Dim Numbers As String = "12345678901234567890"
    Dim Lower As String = "abcdefghijklmnopqrstuvwxyzyz"
    Dim Upper As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZYZ"
    Dim intnamelength As Integer = 1


    If CheckBox1.Checked Then strinputstring &= Lower
    If CheckBox2.Checked Then strinputstring &= Numbers
    If CheckBox3.Checked Then strinputstring &= Upper

    intlength = Len(strinputstring)

    Integer.TryParse(NumericUpDown1.Text, intnamelength)

    Randomize()

    strname = ""

    For inStep = 1 To intnamelength

        intRnd = Int(Rnd() * intlength) + 1

        strname = strname & Mid(strinputstring, intRnd, 1)

    Next

    Return strname

End Function
Run Code Online (Sandbox Code Playgroud)

Ňɏs*_*arp 14

这不依赖于UI控件,也不使用传统的.NET前VB函数.而是将变量传递给生成器,因此它与UI无关.它也不使用,As Object因为字符串是字符串.

<Flags>
Private Enum PasswordParts
    Upper = 1
    Lower = 2
    Numerals = 4
    All = 7
End Enum

Private Shared RNG As New Random()
Private Shared Numerals As String = "0123456789"
Private Shared Upper As String = "ABCDEFGHIJKLMNPQRSTUVWXYZYZ"
Private Shared Lower As String = "abcdefghijkmnopqrstuvwxyzyz"

Private Function GeneratePassword(length As Int32, 
             Optional pwparts As PasswordParts = PasswordParts.All) As String
    Dim PWCharPool As String = ""
    Dim PW As New List(Of String)()

    ' check the requested length
    If length < 6 Then length = 6
    If length > 20 Then length = 20

    ' build the pool and add the first of required characters
    ' for assure minimum conformance
    If pwparts.HasFlag(PasswordParts.Lower) Then
        PW.Add(Lower(RNG.Next(0, Lower.Length)))
        PWCharPool &= Lower
    End If
    If pwparts.HasFlag(PasswordParts.Upper) Then
        PW.Add(Upper(RNG.Next(0, Upper.Length)))
        PWCharPool &= Upper
    End If
    If pwparts.HasFlag(PasswordParts.Numerals) Then
        PW.Add(Numerals(RNG.Next(0, Numerals.Length)))
        PWCharPool &= Numerals
    End If

    ' pick the rest of the elements
    For n As Int32 = PW.Count To length - 1
        PW.Add(PWCharPool(RNG.Next(0, PWCharPool.Length)))
    Next

    ' shuffle the result so that the
    ' first 1-3 chars are not predictable
    Shuffle(PW, RNG)
    ' create a string from the result
    Return String.Join("", PW)
End Function
Run Code Online (Sandbox Code Playgroud)
  • 请注意,没有小写L或大写O.用户会混淆这与0和1,所以将其删除或0和1(或两者)
  • 如果对至少1个upper,lower和numbers的要求很难,则不需要If语句(不是块):只需在将每个列表添加到池中之前从每个列表中选择一个.你也不需要Enum或者param.我根据问题中的代码离开了它们
    • 请注意,在调用此方法之前,如果没有单击复选框,则应添加要处理的代码.
  • StringBuilder可以使用A 来代替List(of String),但字符串非常短,以至于它在循环中运行很多次,甚至节省的时间都是微不足道的.

测试它:

Dim enumValues = [Enum].GetValues(GetType(PasswordParts)).Cast(Of Int32)()

For n As Int32 = 1 To 1000
    Dim style = CType(enumValues(RNG.Next(0, 4)), PasswordParts)
    Dim pwLen = RNG.Next(6, 21)

    Dim PW = GeneratePassword(pwLen, style)

    ' get riled up if the length does not match
    Debug.Assert(PW.Length = pwLen)
    Console.WriteLine("style: {0}  pw: '{1}' (len={2})", style, PW, PW.Length)
Next
Run Code Online (Sandbox Code Playgroud)

样本输出:

风格:上限:'QFHGPLIEEYPRP'(len = 13)
风格:所有pw:'Z9Y3CoW'(len = 7)
风格:下pw:'tyghanjzudhhorfmvjr'(len = 19)
风格:所有pw:'XyY3q10N6S'(len = 10)
style:Upper pw:'IOZGTTQTPCYLKGEFRZ'(len = 18)
样式:所有pw:'7t5CNMUM0GdWb'(len = 13)
样式:Upper pw:'YIFXHRKEICOHXEUX'(len = 16)

然后,帮助shuffle(这在某种程度上是可选的):

' Standared FY shuffle for List(Of T)
Public Sub Shuffle(Of T)(items As List(Of T), rnd As Random)
    Dim temp As T
    Dim j As Int32

    For i As Int32 = items.Count - 1 To 0 Step -1
        ' Pick an item for position i.
        j = rnd.Next(i + 1)

        ' Swap them.
        temp = items(i)
        items(i) = items(j)
        items(j) = temp
    Next i
End Sub
Run Code Online (Sandbox Code Playgroud)

最大的问题是没有人能记住这样的密码,因此它们被粘贴到显示器或键盘的底部.更好的方法是让用户选择PW并通过检查他们为长度和内容选择的字符串来验证它是否符合任何规则.这将允许my~MuffyDoodle123或某些用户可以记住.也许强迫他们定期更换它,并可能添加一个TrashCan用户存储旧PW,这样他们就不能在6或9个月内重复使用相同的PW.

一种自动生成可记忆PW的方法是使用单词.创建一个包含数千个形容词和副词的列表,以及另外几千个名词的列表(比听起来更容易 - 有在线生成器),你可以创建一个联合组合加一个特殊字符:

Rancid3Rain
枯萎$耳语
奶油/棉
持久/帝国
Maximum7Mist
油腻/荣耀
Vaporized_Vision
有毒!泪
愤怒!算盘

"硬"部分是使用集中列表并在使用时丢弃单词,因此生成的密码中不会有重复的单词.只有当其中一个队列变低时,你才能重新开始.