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(或两者)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
有毒!泪
愤怒!算盘
"硬"部分是使用集中列表并在使用时丢弃单词,因此生成的密码中不会有重复的单词.只有当其中一个队列变低时,你才能重新开始.