不带-AsPlainText -Force的ConvertTo-SecureString

时间:2016-10-04 04:27:00

标签: powershell securestring

PSScriptAnalyzer有一个PSAvoidUsingConvertToSecureStringWithPlainText警告。意味着使用以下代码将失败。

$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$securePassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$configCredential = New-Object System.Management.Automation.PSCredential ($username,$securePassword)

然而,如果没有-AsPlainText -Force选项,如何将常规字符串转换为安全字符串几乎没有(/无)指导。 (我确实理解常规字符串的安全含义)

如何安全地实现上述目标/不用PSScriptAnalyzer(我不打算压制消息)

1 个答案:

答案 0 :(得分:2)

我不能完全说出你在问什么,但我会就你对你的问题所作的不同解释给出答案。

“如何在没有ConvertTo-SecureString的情况下为PSCredential生成密码?”

您可以将常规字符串直接传递给构造函数,并在内部将其转换为SecureString。

$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)

但是,使用SecureString值时的最佳做法是首先在明文中永远不会有秘密值 - 这是您必须使用-Force指定-AsPlainText的原因,也可能是PSScriptAnalyzer规则的原因存在于第一位,就是劝阻这种做法。如果您依靠SecureString的安全性来减轻威胁,那么您应该通过避免明文$password变量来遵循这种温和的强制:

$configCredential = New-Object PSCredential ($username, [System.Web.Security.Membership]::GeneratePassword(128,0))

“如何在不跳闸或抑制PSScriptAnalyzer错误的情况下将字符串转换为安全字符串?”

如果您不关心凭据对象本身,但想要使用SecureString而不使用ConvertTo-SecureString,您仍然可以(ab)使用PSCredential类来实现此目的。一个更容易阅读的例子:

$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)
$securePassword = $configCredential.Password

遵循最佳做法的单行:

$securePassword = New-Object PSCredential ($username, [System.Web.Security.Membership]::GeneratePassword(128,0)) | Select-Object -ExpandProperty Password

您还可以将字符串分成字符,然后逐个将它们附加到SecureString:

$securePassword = New-Object SecureString
foreach ($char in [System.Web.Security.Membership]::GeneratePassword(128,0).ToCharArray()) {
    $securePassword.AppendChar($char)
}