복잡성 요구 사항을 충족하는 암호를 생성하는 간단한 모듈을 작성했습니다.
Module PasswordGenerator
Private ReadOnly _alphaChars As Char() = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToArray()
Private ReadOnly _digitChars As Char() = "0123456789".ToArray()
Private ReadOnly _nonAlphaNumChars As Char() = "_-.,:;!$%&/()[]=+#".ToArray()
Private ReadOnly _allPswChars As Char() = _alphaChars.Concat(_digitChars).Concat(_nonAlphaNumChars).ToArray()
Public Function GeneratePassword(length As Integer, minNonAlphaNum As Integer, minDigits As Integer) As String
Return GeneratePassword(length, minNonAlphaNum, minDigits, New Random(GetSeed()))
End Function
Public Function GeneratePassword(length As Integer, minNonAlphaNum As Integer, minDigits As Integer, rnd As Random) As String
Dim selectedChars As List(Of Char),
psw As String,
rndSelectedChar As Integer
If length < (minNonAlphaNum + minDigits) Then Throw New ArgumentException
selectedChars = New List(Of Char)(length)
selectedChars.AddRange(GetRandomChars(_nonAlphaNumChars, minNonAlphaNum, rnd))
selectedChars.AddRange(GetRandomChars(_digitChars, minDigits, rnd))
selectedChars.AddRange(GetRandomChars(_allPswChars, (length - minNonAlphaNum - minDigits), rnd))
psw = ""
For i As Integer = 1 To selectedChars.Count
rndSelectedChar = rnd.Next(0, selectedChars.Count)
psw &= selectedChars(rndSelectedChar)
selectedChars.RemoveAt(rndSelectedChar)
Next
Return psw
End Function
Private Function GetSeed() As Integer
Dim guidString As String
guidString = Guid.NewGuid().ToString("N").Substring(0, 5)
Return Int32.Parse(guidString, Globalization.NumberStyles.HexNumber)
End Function
Private Function GetRandomChars(charRange As Char(), count As Integer, rnd As Random) As List(Of Char)
Dim retVal As New List(Of Char),
selectedPos As Integer
If count < 1 Then Return retVal
For i As Integer = 1 To count
selectedPos = rnd.Next(0, charRange.Length)
retVal.Add(charRange(selectedPos))
Next
Return retVal
End Function
End Module
GetSeed()
함수 없이이 코드를 사용하면 루프에서 암호를 생성하면 동일한 암호를 여러 번 얻을 수 있습니다. guid를 임의의 시드로 사용하면 NewGuid
함수 가 동일한 guid를 생성하지 않도록 보장 하기 때문에 동일한 암호를 얻지 못하도록 할 수 있습니다 . GUID를 생성하는 시스템 제공 기능은 동일한 GUID를 얻지 못하도록 보장하지만 일종의 예측 가능 (또는 다른 기능보다 예측 가능-예측 불가능)이기 때문에 암호화 환경에서 임의 값을 생성하도록 만들어지지 않았습니다.
Random
이처럼 민감한 것에 전혀 사용하지 마십시오 . RNGCryptoServiceProvider
대신 사용 하면 적절하게 안전한 시드를 제공합니다.
사용하는 것은 API만큼 간단하지 않습니다. Random
기본적으로 바이트 만 가져 오며 잠재적으로 0이 아닌 것으로 보장되지만 더 적절한 API입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다