Функция генерации пароля на VBScript

Опубликовано: 16.09.2020
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

Для того, чтобы обеспечить безопасную работу компьютеров и серверов в инфраструктуре компании рекомендуется не выдавать администраторские права обычным пользователям, а так же регулярно менять пароли локальных учетных записей администраторов. Для этой цели я использую VB-скрипт, который регулярно запускается на компьютере, обновляет пароль и отправляет новый пароль в базу данных.

Чтобы обеспечить строгий пароль для этой задачи, я написал следующую функцию, которая генерирует пароль указанной длины из 4 составляющих: прописные буквы, заглавные буквы, цифры, специальные символы. Причем из выбора заглавных букв исключена буква "O", который можно трактовать, как цифру "0", а из специальных символов исключены скобки и подстановочные спецсимволы, которые используются в SQL запросах.

Function GeneratePassword(iPasswordLength)
  strPassword = ""
  sLowerCaseLetters = "abcdefghijkmnopqrstuvwxyz"
  sUpperCaseLetters = "ABCDEFGHJKLMNPQRSTUVWXYZ"
  sNumbers = "0123456789"
  sSpecialSymbols = "!@#$^&*-+=/\~"
 
  iLetters = iPasswordLength - round(iPasswordLength / 3)
  iOthers = iPasswordLength - iLetters
 
  iLowLetters = iLetters - round(iLetters/3)
  iUpLetters = iLetters - iLowLetters
 
  iNumbers = iOthers - round(iOthers/3)
  iSymbols = iOthers - iNumbers
  For i = 1 to iLowLetters
    Randomize
    iCurrentSymbol = Int(rnd()*Len(sLowerCaseLetters) + 1)
    strPassword = strPassword & Mid(sLowerCaseLetters, iCurrentSymbol, 1)
    WScript.Sleep(10)
  Next
 
  For i = 1 to iUpLetters
    Randomize
    iCurrentSymbol = Int(rnd()*Len(sUpperCaseLetters) + 1)
    strPassword = strPassword & Mid(sUpperCaseLetters, iCurrentSymbol, 1)
    WScript.Sleep(10)
  Next
 
  For i = 1 to iSymbols
    Randomize
    iCurrentSymbol = Int(rnd()*Len(sSpecialSymbols) + 1)
    strPassword = strPassword & Mid(sSpecialSymbols, iCurrentSymbol, 1)
    WScript.Sleep(10)
  Next
 
  For i = 1 to iNumbers
    Randomize
    iCurrentSymbol = Int(rnd()*Len(sNumbers) + 1)
    strPassword = strPassword & Mid(sNumbers, iCurrentSymbol, 1)
    WScript.Sleep(10)
  Next
 
  GeneratePassword = strPassword
End Function

Данная функция берет за основу указанную длину пароля и 2/3 символов отводит под буквы, 2/9 - под цифры, 1/9 - под спецсимволы.

Для генерации пароля используется функция RND - псевдогенератор случайных чисел, которая выдает случайное число от 0 до 1, исключая саму единицу, но включая ноль. Чтобы получить случайное число в диапазоне от единицы до длины строки выборки символов, я умножаю сгенерированное число на длину строки, отбрасываю дробную часть и добавляю единицу. Полученное число указывает на номер символа в строке выборки.

Чтобы функция RND выдавала случайные числа, перед каждым её запуском я выполняю процедуру RANDOMIZE, которая основана на таймере компьютера, а после запуска делаю паузу в 10 миллисекунд, чтобы таймер сдвинулся на большее количество интервалов.

Примеры паролей, полученных функцией GeneratePassword(12):
yrffhTAP*169
wbmqaKAF$786
fsnfpTBQ/169
vgvhyHKR@925
erufiTHP-119
unibkPXK+978

Для своего удобства я не стал менять местами большие и маленькие буквы, спецсимволы и цифры, но если это требуется, то полученный пароль можно перемешать перед возвращением значения в тело скрипта, чтобы усилить его.