Visual Basic 密碼生成器
我的任務是創建一個 Visual Basic 隨機密碼生成器。我想出了下面的方法,但是它的密碼標準有點粗糙。我希望它生成的每個密碼至少有 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 個用於小寫,一個用於數字。
這使我能夠在表單中擁有一個複選框功能,這是一個加號。我已經玩過程式碼,它現在根據我使用複選框選擇的內容生成密碼,正如我所說的,這很棒但是我不能總是保證如果我選擇,數字,大寫和小寫,我會得到一個包含所有三個的密碼,有時即使三個框都被選中,密碼也只會包含數字。
猜測這與我只是要求它使用我給它的字元生成隨機密碼的事實有關,並且沒有驗證它已經使用了所有三個選項。
對此的任何幫助都會很棒。我正在嘗試,我不只是發布並希望有人會為我做這項工作。如果有人能指出我正確的方向,那就太好了。
這是我的新程式碼。
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 控制項,也不使用舊的 pre-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。使用者會將這些與0and混淆1,因此要麼刪除它們,要麼刪除0and1(或兩者)如果對至少 1 個 upper、lower 和 numeric 的要求是hard,那麼就不需要這些
If語句(不是塊):在將它們添加到池之前總是從每個列表中選擇一個。您也不需要Enumor 參數。我根據問題中的程式碼離開了它們
- 請注意,在呼叫此方法之前,您應該添加程式碼來處理當他們沒有點擊複選框時。
A
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樣本輸出:
樣式:上密碼:‘QFHGPLIEEYPRP’(len=13)
樣式:所有密碼:‘Z9Y3CoW’(len=7)
樣式:下密碼:’tyghanjzudhhorfmvjr’(len=19)
樣式:所有密碼:‘XyY3q10N6S’(len= 10)
樣式:上密碼:‘IOZGTTQTPCYLKGEFRZ’ (len=18)
樣式:所有密碼:‘7t5CNMUM0GdWb’ (len=13)
樣式:上密碼:‘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以按使用者儲存舊的 PW,這樣他們就不能在 6 或 9 個月內重複使用相同的 PW。自動生成令人難忘的密碼的一種方法是使用單詞。創建一個包含數千個形容詞和副詞的列表以及另一個包含數千個名詞的列表(比聽起來容易 - 有線上生成器),您可以創建頭韻組合加上一個特殊字元:
Rancid3Rain Withered
$Whisper
Creamy/Cotton
Enduring/Empire
Maximum7Mist
Greasy/Glory
Vaporized_Vision
Toxic!Tears
Angry!Abacus
“硬”部分是使用集中列表並在使用時丟棄單詞,這樣生成的密碼中就不會出現重複的單詞。只有當其中一個隊列變少時,您才會重新開始。