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(我不打算压制消息)
最佳答案 我不能完全说出你在问什么,但我会给出你对你的问题的不同解释的答案.
“如何在没有ConvertTo-SecureString的情况下为PSCredential生成密码?”
您可以将常规字符串直接传递给构造函数,并在内部将其转换为SecureString.
$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)
但是,使用SecureString值时的最佳做法是首先在明文中永远不会有秘密值 – 您必须使用-AsPlainText指定-Force的原因,以及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)
}