gpt4 book ai didi

.net - Visual Basic 密码生成器

转载 作者:行者123 更新时间:2023-12-02 03:22:36 25 4
gpt4 key购买 nike

我的任务是创建一个 Visual Basic 随 secret 码生成器。我想出了下面的方法,它可以工作,但是它的密码标准有点粗糙。我希望它生成的每个密码至少包含 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

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

对,我稍微改变了我的代码,所以我现在得到了三个包含不同字符的字符串,1 个代表大写字母,1 个代表小写字母,1 个代表数字。

这使我能够在表单中拥有复选框功能,这是一个优点。我已经玩过代码了,它现在根据我在复选框中选择的内容生成密码,正如我所说,这很棒,但是我不能总是保证如果我选择数字、上限和下限,我将获得包含所有三个的密码,有时即使所有三个框都被选中,密码也只包含数字。

猜测这与我只是要求它使用我给它的字符生成随 secret 码有关,并且没有验证它是否使用了所有三个选项。

对此的任何帮助都会很棒。我正在努力,我不只是发帖并希望有人能为我做这项工作。如果有人能指出我正确的方向,那就太好了。

这是我的新代码。

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

最佳答案

这不依赖于 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
  • 请注意,没有小写的 L 或大写的 O。用户会将01混淆,因此要么删除它们,要么删除01(或两者)
  • 如果至少 1 个大写、小写和数字的要求很难,那么就没有必要使用 If 语句(不是 block ):只需始终选择在将它们添加到池中之前,从每个列表中选择一个。您也不需要 Enum 或参数。我根据问题中的代码留下了它们
    • 请注意,在调用此方法之前,您应该添加代码来处理他们单击复选框的情况。
  • 可以使用 StringBuilder 代替 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

示例输出:

style: Upper pw: 'QFHGPLIEEYPRP' (len=13)
style: All pw: 'Z9Y3CoW' (len=7)
style: Lower pw: 'tyghanjzudhhorfmvjr' (len=19)
style: All pw: 'XyY3q10N6S' (len=10)
style: Upper pw: 'IOZGTTQTPCYLKGEFRZ' (len=18)
style: All pw: '7t5CNMUM0GdWb' (len=13)
style: Upper pw: 'YIFXHRKEICOHXEUX' (len=16)

然后,洗牌的助手(这在某种程度上是可选的):

' 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
<小时/>

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

自动生成令人难忘的密码的一种方法是使用文字。创建一个包含数千个形容词和副词的列表以及另一个包含数千个名词的列表(比听起来容易 - 有在线生成器),您可以创建头韵组合加上特殊字符:

Rancid3Rain
Withered$Whisper
Creamy/Cotton
Enduring/Empire
Maximum7Mist
Greasy/Glory
Vaporized_Vision
Toxic!Tears
Angry!Abacus

“困难”部分是使用集中列表并丢弃使用的单词,这样生成的密码中就不会出现重复的单词。只有当其中一个队列的数量变少时,您才会重新开始。

关于.net - Visual Basic 密码生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41459165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com