VB6 Генератор паролей не работает на китайском / русском ПК - PullRequest
1 голос
/ 18 ноября 2011

Я унаследовал некоторый устаревший код vb6.Это инструмент, который генерирует пароль локального администратора для ПК с Windows.Пароль должен содержать только ограниченный набор символов.Инструмент работает нормально .. до тех пор, пока он не работает на китайском или русском ПК.Там он генерирует странные пароли, которые никто не может ввести. Конечно, это как-то связано с текущей культурой операционной системы.Функция Chr (CharCode) возвращает некоторые странные символы в этих системах.Кто-нибудь знает, как сделать эту культуру инвариантной?Я только хочу, чтобы инструмент генерировал пароли со стандартными символами ASCII.

Function generatePassword(PASSWORD_LENGTH)
Dim NUMLOWER, NUMUPPER, LOWERBOUND, UPPERBOUND, LOWERBOUND1, UPPERBOUND1, SYMLOWER, SYMUPPER
Dim newPassword, count, pwd
Dim pCheckComplex, pCheckComplexUp, pCheckComplexLow, pCheckComplexNum, pCheckComplexSym, pCheckAnswer

  NUMLOWER = 48     ' 48 = 0
  NUMUPPER = 57     ' 57 = 9
  LOWERBOUND = 65   ' 65 = A
  UPPERBOUND = 90   ' 90 = Z
  LOWERBOUND1 = 97  ' 97 = a
  UPPERBOUND1 = 122 ' 122 = z
  SYMLOWER = 33     ' 33 = !
  SYMUPPER = 46     ' 46 = .
  pCheckComplexUp = 0  ' used later to check number of character types in password
  pCheckComplexLow = 0 ' used later to check number of character types in password
  pCheckComplexNum = 0 ' used later to check number of character types in password
  pCheckComplexSym = 0 ' used later to check number of character types in password

  ' initialize the random number generator
  Randomize

  newPassword = ""
  count = 0
  Do Until count = PASSWORD_LENGTH
    ' generate a num between 2 and 10

    ' if num <= 2 create a symbol
    If Int((10 - 2 + 1) * Rnd + 2) <= 2 Then
      'pwd = Int( ( SYMUPPER - SYMLOWER + 1 ) * Rnd + SYMLOWER )

      pwd = Int((UPPERBOUND1 - LOWERBOUND1 + 1) * Rnd + LOWERBOUND1)

      ' if num is between 3 and 5 create a lowercase
    ElseIf Int((10 - 2 + 1) * Rnd + 2) > 2 And Int((10 - 2 + 1) * Rnd + 2) <= 5 Then
      pwd = Int((UPPERBOUND1 - LOWERBOUND1 + 1) * Rnd + LOWERBOUND1)

      ' if num is 6 or 7 generate an uppercase
    ElseIf Int((10 - 2 + 1) * Rnd + 2) > 5 And Int((10 - 2 + 1) * Rnd + 2) <= 7 Then
      pwd = Int((UPPERBOUND - LOWERBOUND + 1) * Rnd + LOWERBOUND)

    Else
      pwd = Int((NUMUPPER - NUMLOWER + 1) * Rnd + NUMLOWER)
    End If

    If Chr(pwd) <> "l" And Chr(pwd) <> "I" Then
      newPassword = newPassword + Chr(pwd)

      count = count + 1
    End If

    'Check to make sure that a proper mix of characters has been created.  If not discard the password.
    If count = (PASSWORD_LENGTH) Then
      For pCheckComplex = 1 To PASSWORD_LENGTH
        'Check for uppercase
        If Asc(Mid(newPassword, pCheckComplex, 1)) > 64 And Asc(Mid(newPassword, pCheckComplex, 1)) < 90 Then
          pCheckComplexUp = 1
        'Check for lowercase
        ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 96 And Asc(Mid(newPassword, pCheckComplex, 1)) < 123 Then
          pCheckComplexLow = 1
        'Check for numbers
        ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 47 And Asc(Mid(newPassword, pCheckComplex, 1)) < 58 Then
          pCheckComplexNum = 1
        'Check for symbols
        ElseIf Asc(Mid(newPassword, pCheckComplex, 1)) > 32 And Asc(Mid(newPassword, pCheckComplex, 1)) < 47 Then
          pCheckComplexSym = 1
        End If
      Next

      'Add up the number of character sets.  We require 3 or 4 for a complex password.
      pCheckAnswer = pCheckComplexUp + pCheckComplexLow + pCheckComplexNum + pCheckComplexSym

      If pCheckAnswer < 3 Then
        newPassword = ""
        count = 0
      End If
    End If
  Loop
  'The password is good so return it
  generatePassword = newPassword
End Function

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Комментарий Динны правильный. Просто измените Chr на ChrW и измените Asc на AscW.

  • ChrW принимает коды Unicode
  • Chr принимает кодовые точки «ANSI», и значение конкретной кодовой точки будет различным в зависимости от кодовой страницы системы. Например, на китайских и русских кодовых страницах.
0 голосов
/ 18 ноября 2011

Поскольку российские и китайские ПК (и многие другие) не работают с набором символов ASCII, но имеют UNICODE для конкретной культуры, я не удивлен, что ваша программа паролей генерирует пароль, который не может быть введен пользователем.

Вы добьетесь успеха, только отойдя от ASCII.

В сети доступно несколько генераторов паролей с открытым исходным кодом. Если вам удастся найти его с исходным кодом, то вы, так сказать, будете в квидсах.

...