Ничего сверх особенного, просто еще один генератор паролей. Вот только это генератор произносимых паролей на PowerShell. Мне надоели полностью рандомные пароли, которые невозможно запомнить. В онлайне я пользовался ресурсом https://genpas.peter23.com, но когда надо создать пользователя в домене, да еще и автоматизировать это дело, скрипт в онлайн не сбегает.

Автор сайта утверждает, что использует алгоритм PWGEN и я не вижу причин ему не верить. Поэтому я собрался в кучку и слямзил оттуда js-скрипт и переточил его под PowerShell. Работает, кстати, начиная с 3 версии точно – формулировки, которые понимает исключительно свежий PS я использовать не стал.

$pwgen_CONSONANT = 1
$pwgen_VOWEL = (1 -shl 1)
$pwgen_DIPTHONG = (1 -shl 2)
$pwgen_NOT_FIRST = (1 -shl 3)

$genpas_spec_symbols = '!"#$%&\()*+,-./:;<=>?@[\]^_`{|}~'''

$pwgen_ELEMENTS = @(
    @("a" , ($pwgen_VOWEL))
    @("ae", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("ah", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("ai", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("b" , ($pwgen_CONSONANT)),
    @("c" , ($pwgen_CONSONANT)),
    @("ch", ($pwgen_CONSONANT -bor $pwgen_DIPTHONG)),
    @("d" , ($pwgen_CONSONANT)),
    @("e" , ($pwgen_VOWEL)),
    @("ee", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("ei", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("f" , ($pwgen_CONSONANT)),
    @("g" , ($pwgen_CONSONANT)),
    @("gh", ($pwgen_CONSONANT -bor $pwgen_DIPTHONG -bor $pwgen_NOT_FIRST)),
    @("h" , ($pwgen_CONSONANT)),
    @("i" , ($pwgen_VOWEL)),
    @("ie", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("j" , ($pwgen_CONSONANT)),
    @("k" , ($pwgen_CONSONANT)),
    @("l" , ($pwgen_CONSONANT)),
    @("m" , ($pwgen_CONSONANT)),
    @("n" , ($pwgen_CONSONANT)),
    @("ng", ($pwgen_CONSONANT -bor $pwgen_DIPTHONG -bor $pwgen_NOT_FIRST)),
    @("o" , ($pwgen_VOWEL)),
    @("oh", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("oo", ($pwgen_VOWEL -bor $pwgen_DIPTHONG)),
    @("p" , ($pwgen_CONSONANT)),
    @("ph", ($pwgen_CONSONANT -bor $pwgen_DIPTHONG)),
    @("qu", ($pwgen_CONSONANT -bor $pwgen_DIPTHONG)),
    @("r" , ($pwgen_CONSONANT)),
    @("s" , ($pwgen_CONSONANT)),
    @("sh", ($pwgen_CONSONANT -bor $pwgen_DIPTHONG)),
    @("t" , ($pwgen_CONSONANT)),
    @("th", ($pwgen_CONSONANT -bor $pwgen_DIPTHONG)),
    @("u" , ($pwgen_VOWEL)),
    @("v" , ($pwgen_CONSONANT)),
    @("w" , ($pwgen_CONSONANT)),
    @("x" , ($pwgen_CONSONANT)),
    @("y" , ($pwgen_CONSONANT)),
    @("z" , ($pwgen_CONSONAN))
)

function pwgen_generate ($pwlen, $inc_capital, $inc_number, $inc_spec) {
    $result = ""
    while (-not $result) {
        $result = pwgen_generate0 -pwlen $pwlen -inc_capital $inc_capital -inc_number $inc_number -inc_spec $inc_spec
    }
    return $result
}

function pwgen_generate0 ([int]$pwlen, [bool]$inc_capital, [bool]$inc_number, [bool]$inc_spec) {
    $result = ""
    $prev = 0;
    $isFirst = $true;
    if ((Get-Random -Maximum 1.0) -lt 0.5) {
        $shouldBe = $pwgen_VOWEL
    }
    else {
        $shouldBe = $pwgen_CONSONANT
    }
    while ($result.length -lt $pwlen) {
        $i = [math]::Truncate(($pwgen_ELEMENTS.count - 1) * (Get-Random -Maximum 1.0))
        $str = $pwgen_ELEMENTS[$i][0]
        $flags = $pwgen_ELEMENTS[$i][1]
        if (($flags -band $shouldBe) -eq 0) {
            continue
        }
        if ($isFirst -and ($flags -band $pwgen_NOT_FIRST)) {
            continue
        }
        if (($prev -band $pwgen_VOWEL) -and ($flags -band $pwgen_VOWEL) -and ($flags -band $pwgen_DIPTHONG)) {
            continue
        }
        if (($result.length + $str.length) -gt $pwlen) {
            continue
        }
        if ($inc_capital) {
            if (($isFirst -or ($flags -band $pwgen_CONSONANT)) -and ((Get-Random -Maximum 1.0) -gt 0.3)) {
                $str = $str.substring(0, 1).toupper() + $str.substring(1)
                $inc_capital = $false
            }
        }
        $result += $str
        if ($inc_number) {
            if ((-not $isFirst) -and ((Get-Random -Maximum 1.0) -lt 0.3)) {
                if (($result.length + $str.length) -gt $pwlen) {
                    $result = $result.Substring(0, $result.Length - 1)
                }
                $result += [math]::Truncate(10 * (Get-Random -Maximum 1.0)).toString()
                $inc_number = $false
                $isFirst = $true
                $prev = 0
                if ((Get-Random -Maximum 1.0) -lt 0.5) {
                    $shouldBe = $pwgen_VOWEL
                }
                else {
                    $shouldBe = $pwgen_CONSONANT
                }
                continue
            }
        }

        if ($inc_spec) {
            if ((-not $isFirst) -and ((Get-Random -Maximum 1.0) -lt 0.3)) {
                if (($result.length + $str.length) -gt $pwlen) {
                    $result = $result.Substring(0, $result.Length - 1)
                }
                $possible = $genpas_spec_symbols
                $result += $possible.chars([math]::Truncate((Get-Random -Maximum 1.0) * $possible.length))
                $inc_spec = $false
                $isFirst = $true
                $prev = 0
                if ((Get-Random -Maximum 1.0) -lt 0.5) {
                    $shouldBe = $pwgen_VOWEL
                }
                else {
                    $shouldBe = $pwgen_CONSONANT
                }
                continue
            }
        }
        if ($shouldBe -eq $pwgen_CONSONANT) {
            $shouldBe = $pwgen_VOWEL;
        }
        else {
            if (($prev -band $pwgen_VOWEL) -or ($flags -band $pwgen_DIPTHONG) -or ((Get-Random -Maximum 1.0) -gt 0.3)) {
                $shouldBe = $pwgen_CONSONANT;
            }
            else {
                $shouldBe = $pwgen_VOWEL;
            }
        }
        $prev = $flags;
        $isFirst = $false;
    }
    if ($inc_capital -or $inc_number -or $inc_spec) {
        return $null
    }
    return $result
}

Использовать в формате:

pwgen_generate -pwlen 10 -inc_capital $true -inc_number $true -inc_spec $false
  • pwlen – длина пароля, число
  • inc_capital – нужны ли заглавные буквы, булево
  • inc_number – нужны ли цифры, булево
  • inc_spec – нужны ли спецсимволы, булево

Короче автору сайта – респект, мне – просто спасибо.

Добавить комментарий