Scripting Games: Advanced PowerShell — Event 5

sg5

Сооружаем скрипт для пароля по методике Scripting Guys🙂 Пароль должен быть проверен на соответствие следующим критериям:

Make sure that the password is not an actual word.
Make sure that the password, minus the last letter, is not an actual word.
Make sure that the password, minus the first letter, is not an actual word.
Make sure that the password does not simply substitute 0 (zero) for the letter o.
Make sure that the password does not simply substitute 1 (one) for the letter l.
Make sure that the password is at least 10 characters long but no more than 20 characters long.
Make sure that the password includes at least one number (the digits 0 through 9).
Make sure that the password includes at least one uppercase letter.
Make sure that the password includes at least one lowercase letter.
Make sure that the password includes at least one symbol.
Make sure that the password does not include four (or more) lowercase letters in succession.
Make sure that the password does not include four (or more) uppercase letters in succession.
Make sure that the password does not include any duplicate characters.

Подробнее тут.

В моём решении большая часть проверок выполняется с помощью регулярных выражений🙂

SG5-Password.ps1
# Объявляем строковый параметр скрипта. param ([string]$Password) # Стартовый рейтинг пароля. $Score = 13 # Загружаем список слов. $Words = Get-Content "c:ScriptsWordList.txt" # Функция для подсчета количества вхождений указанного символа в слове. function occs ([string]$word, [string]$letter) { # Просто удаляем из слова все символы кроме указанного и смотрим длину🙂 ($word -creplace "[^$($letter)]").length } # Оператор switch. Проверяются все условия подряд, так как break нигде не # указан. При совпадении условия - выводится сообщение и уменьшается $Score switch ($Password) { # Содержится ли пароль в массиве $Words, проверка простым оператором # -contains. Если содержится - устанавливаем переменную $Actual = $True, # чтобы уже не пытаться искать его там заменив "0" на "o" и "1" на "l" {$Words -contains $_} {$Score--; Write-Host "Password is actual word"; $Actual = $True} # Удаляем последний символ, и смотрим - содержится ли в $Words {$Words -contains ($_ -replace ".$")} {$Score--; Write-Host "Password minus the last letter, is actual word"} # Аналогично, но удаляем первый символ. {$Words -contains ($_ -replace "^.")} {$Score--; Write-Host "Password minus the first letter, is actual word"} # Если пароль не содержится в списке слов - меняем "0" на "o" и ищем снова. {!$Actual -and ($Words -contains ($_ -replace "0","o"))} {$Score--; Write-Host "Password is actual word that does substitute 0 (zero)"} # Аналогично, но меняем "1" на "l" {!$Actual -and ($Words -contains ($_ -replace "1","l"))} {$Score--; Write-Host "Password is actual word that does substitute 1 (one)"} # Проверяем длину пароля {$_.length -lt 10 -or $_.length -gt 20} {$Score--; Write-Host "Password length is less than 10 or more than 20 characters long"} # Проверяем содержатся ли в пароле цифры (группа d в регулярных выражениях # означает любую цифру). {$_ -notmatch "d"} {$Score--; Write-Host "Password does not include numbers"} # Проверяем содержатся ли заглавные буквы. Группа [A-Z] указывает любой # символ из диапазона A-Z. -Cnotmatch в отличии от -notmatch проводит # сравнение учитывая регистр символов. {$_ -cnotmatch "[A-Z]"} {$Score--; Write-Host "No uppercase letters in password"} # Аналогично с маленькими буквами {$_ -cnotmatch "[a-z]"} {$Score--; Write-Host "No lowercase letters in password"} # Смотрим есть ли в пароле что то кроме букв и цифр, короче говоря символы. # ^ в начале группы означает "все кроме", w - любая буква, и d - цифра {$_ -notmatch "[^wd]"} {$Score--; Write-Host "Password does not include symbols"} # Проверяем содержатся ли 4 маленькие буквы подряд. {4,} после группы # указывает что для совпадения элемент должен повторится 4 и более раз. # Например "[z]{2,5}" будет означать "от 2 до 5 букв z". Сравнение опять # чувствительно к регистру символов потому что используется -Cmatch, а не # просто -match {$_ -cmatch "[a-z]{4,}"} {$Score--; Write-Host "Four consecutive lowercase letters in password"} # Аналогично с заглавными буквами. {$_ -cmatch "[A-Z]{4,}"} {$Score--; Write-Host "Four consecutive uppercase letters in password"} # Для каждой буквы от "a" до "z" проверяем количество её вхождений в пароль. {$w=$_; [bool](([char]"a"..[char]"z" |%{occs $w ([char]$_)}) -gt 1) -or [bool](([char]"A"..[char]"Z" |%{occs $w ([char]$_)}) -gt 1)} {$Score--; Write-Host "Password include duplicate characters"} } # Выводим результат if ($Score -le 6) {$Rating = "weak"} elseif ($Score -ge 11) {$Rating = "strong"} else {$Rating = "moderately-strong"} Write-Host "`nA password score of $Score indicates a $Rating password"

Варианты других авторов: MoW, Per Østergaard, Scripting Guys (У всех разные решения проверки на повторный символ, и все лучше чем у меня🙂 Хорошо что мне вообще засчитали — я только буквы проверял😦 ), Kirk Munro (многабукав, ниасилил).

комментария 4 to “Scripting Games: Advanced PowerShell — Event 5”

  1. Bishop Says:

    По-моему самая правильная проверка на повторный символ:
    $pass -cmatch «(.).*\1»

    А использования классов «\p{Ll}» вместо «[A-Z]», «\p{Lu}» вместо [a-z] и т.п. нет даже у Kirk Munro🙂

  2. Xaegr Says:

    2 Bishop: Я не настолько хорошо регэкспы знаю, эти конструкции в первый раз встретил🙂 Этот коммент даже весьма неплохой вордпрессовский антиспам принял за спам🙂
    Кстати что можете порекомендовать по регекспам почитать? Сейчас смотрю на Mastering Regular Expressions, — смогу такие же фокусы делать?🙂

  3. Xaegr Says:

    О! Дошло что (.).*\1 делает!🙂 Классно🙂

  4. Bishop Says:

    Литературу не могу посоветовать. Сам фундаментального ничего не читал. Узнал о регекспах из справки по Total Commander. Углубил знания по справке EmEditor-а, например про утверждения: (?<=»)[^»]*(?=») — найдёт текст в кавычках, но без самих знаков кавычек🙂
    Про классы символов узнал из доков PowerShell-а, это похоже чисто .NET-товская фича: http://msdn2.microsoft.com/en-us/library/20bw873z.aspx


Обсуждение закрыто.

%d такие блоггеры, как: