【问题标题】:How can I check password complexity?如何检查密码复杂性?
【发布时间】:2021-03-20 08:57:45
【问题描述】:

我正在使用 PowerShell 创建本地用户。我需要从键盘输入:用户名和密码。要获取密码,我可以使用以下方法之一:

$user_details = Get-Credential

$pass = Read-Host -assecureString "Please enter your password"

在这两种情况下,我都会得到加密的密码变量System.Security.SecureString。在这两种情况下,当我尝试创建用户时,使用

New-LocalUser -Name $username -Password $pass

我收到密码不复杂的错误。

New-LocalUser :无法更新密码。提供的价值 新密码不符合长度、复杂性或历史 域的要求。”

由于密码是加密的,(System.Security.SecureString)我无法知道密码的复杂性。如何强制用户输入符合复杂性规则的密码?

(使用未加密的密码对我来说不是一个好的解决方案)

更新: 在几个与良好解决方案相关但不符合我的安全要求的答案之后,我想改写一下:

如何检查已存储在对象中的密码复杂性: System.Security.SecureString(无需解密)

【问题讨论】:

  • $pass.GetNetworkCredential().Password 瞧:明文密码。

标签: powershell credentials password-encryption powershell-5.0 windows-server-2016


【解决方案1】:

除了 TheIncorrigible1 和 KoryGill 已经回答的内容以及您包含的错误消息 为新密码提供的值不符合域的长度、复杂性或历史要求 ,您可以包括测试默认密码复杂性。

如果你这样做

Get-ADDefaultDomainPasswordPolicy

你会得到一个像这样的对象:

ComplexityEnabled           : True
DistinguishedName           : DC=yourdomain,DC=com
LockoutDuration             : 00:30:00
LockoutObservationWindow    : 00:30:00
LockoutThreshold            : 3
MaxPasswordAge              : 42.00:00:00
MinPasswordAge              : 1.00:00:00
MinPasswordLength           : 7
objectClass                 : {domainDNS}
objectGuid                  : 44e3c936-5c8f-40cd-af67-f846c184cc8c
PasswordHistoryCount        : 24
ReversibleEncryptionEnabled : False

从这里您可以检查有趣的属性,例如MinPasswordLength 中密码的最小长度,在PasswordHistoryCount 中可以重复使用多少密码。 如果 ComplexityEnabled 为 True,则密码还需要混合使用大写、小写、数字和非字母数字字符。

我找到了一篇关于 here 你可能想阅读的优秀博客。

【讨论】:

  • 感谢您的回答,但Get-ADDefaultDomainPasswordPolicy仅在域环境中有效,我使用的是工作组(或单一)环境。
  • @orenk 那样的话,看看here
【解决方案2】:

通过在 Powershell 脚本中使用 if 语句,您可以在移动到下一个命令之前验证用户输入。您可以通过以下方式获取所需的密码:

$Input = Read-Host "Please enter your password. `nPassword must meet complexity requirements: 
`nAt least one upper case English letter [A-Z]`nAt least one lower case English letter [a-z]`nAt least one digit [0-9]`nAt least one special character (!,@,#,%,^,&,$)`nMinimum 7 in length."

if(($input -cmatch '[a-z]') -and ($input -cmatch '[A-Z]') -and ($input -match '\d') -and ($input.length -ge 7) -and ($input -match '!|@|#|%|^|&|$'))
{
    Write-Output "$input is valid password"
}
else
{
    Write-Output "$input is Invalid password"
}

【讨论】:

  • 这将得到未加密的密码,我不想使用。
  • 这只是一个示例。您可以删除“写入输出”并使用 $input 值来创建新用户。或者你也可以使用 Try-catch 方法。
  • 这会根据一组要求规则验证字符串,但不考虑哪些设置实际上是有效的。
【解决方案3】:

使用 Try-Catch 是我处理此问题的最佳方式。
我读了密码,试图执行命令
捕获异常错误,密码错误时再次请求密码

【讨论】:

    【解决方案4】:

    解码密码/安全字符串...

    使用此处的答案:PowerShell - Decode System.Security.SecureString to readable password

    然后根据您的需要检查您的密码复杂性,并让用户有机会重新输入。

    【讨论】:

    • 这将解密密码,这是不受欢迎的安全问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多